享元模式

簡介:

      享元模式使用或創建共享使用大量類似的對象。當對象的數量太大,每次都需通過new創建,會給系統帶來難以承受的內存開銷。

 

介紹:

享元模式結構

 

特徵
優點

1.減少系統創建的個數。因爲無需多次創建,靜態保存,可共享使用。

2.外部狀態和內部相對獨立。

缺點 1.存在內部狀態和外部狀態,增加複雜度。
特點

1.創建大量的對象。

2.對象可共享使用。

 

角色
抽象享元角色(Flyweight) 具體享元類的基類。
具體享元角色(ConcreteFlyweight) 實現抽象享元角色所規定的接口。
不共享具體享元角色(UnsharedConcreteFlyweight) 無需共享。可無。
享元工廠角色(FlyweightFactory) 負責創建和管理享元角色。本角色必須保證享元對象可以被系統適當地共享。存在即共享,不存在要創建。

 

使用:

在享元對象內部並且不會隨環境改變而改變的共享部分,可以稱爲是享元對象的內部狀態。而隨環境改變而改變的,不可以共享的狀態就是外部狀態了。

    //Flyweight
    public abstract class Shape
    {
        public int index { get; private set; } //index:內部狀態
        public Shape(int index)
        {
            this.index = index;
        }
        public abstract void Draw(int num); //num:外部狀態
    }

    public enum enumShapeType
    {
        enumSquare,
        enumCircle,
    }

    //ConcreteFlyweight
    public sealed class Square : Shape
    {
        public Square(int index) : base(index) { }
        public override void Draw(int num)
        {
            //do something
        }
    }

    //ConcreteFlyweight
    public sealed class Circle : Shape
    {
        public Circle(int index) : base(index) { }
        public override void Draw(int num)
        {
            //do something
        }
    }

    //FlyweightFactory
    public sealed class ShapeFactory
    {
        private static List<Shape> shapes;
        private int index;
        static ShapeFactory()
        {
            shapes = new List<Shape>();
        }

        public Shape GetShape(int index,enumShapeType name)
        {
            this.index = index;  
            foreach (Shape shape in shapes)
            {
                if (shape.index == index)
                {
                    return shape;
                }
            }
            Shape sh = null;
            if (name == enumShapeType.enumSquare)
            {
                sh = new Square(index);
            }
            else if (name == enumShapeType.enumCircle)
            {
                sh = new Circle(index);
            }
            shapes.Add(sh);
            return sh;
        }
    }
            //享元模式調用
            ShapeFactory factory = new ShapeFactory();

            for (int i = 0; i < 10; i++) 
            {
                Shape shape = null;
                if (i < 5) 
                {
                    shape = factory.GetShape(i, enumShapeType.enumSquare);
                }
                else
                {
                    shape = factory.GetShape(i, enumShapeType.enumCircle);
                }
                shape.Draw(1);  
            }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章