享元模式

简介:

      享元模式的意图是运用共享技术有效地支持大量细粒度的对象。

      在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值