享元模式

简介:

      享元模式使用或创建共享使用大量类似的对象。当对象的数量太大,每次都需通过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);  
            }

 

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