设计模式——享元模式

享元模式就是如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用创建新的对象。享元模式是为数不多的、只为提升系统性能而生的设计模式。它的主要作用就是复用大对象(重量级对象),以节省内存空间和对象创建时间。
我们这里以绘制一个有样式的字体来说明吧,有的时候我们想绘制一个纯色的文字,比如红色,那么我们可能需要创建很多的实例,通常来说,这些实例的差别不大,这个时候,我们可以考虑复用其中创建的某个实例,而不用去new这么多相同的对象,来完成这样的工作。我们下面以这个例子来说明,使用享元模式的前后对比的情况。
使用享元模式前:
这里写图片描述
使用享元模式后:
这里写图片描述
享元模式的意图是通过共享有效支持大量细粒度的对象,来提供应用程序的性能,节省系统中重复创建对象实例的性能消耗,这个怎么理解呢?其实就是以下几点的含义:
1、当我们系统中某个对象类型的实例较多的情况。
2、并且要求这些实例进行分类后,发现真正有区别的分类很少的情况。
例如我们的生活中很多的场景,我们在使用拼音输入的法的时候,如果说我们每个字都是new一个对象实例的操作的话,那么内存中的实例就太可怕,这个时候,我们是不是可以考虑将这些重复的字体在内存中只是创建一次,而是通过复用对象的形式,来组织一些可能有多个字符重复的内容呢?
也许这是一个不错的主意,我们来看看这个示例的过程吧。
这里写图片描述

  public class FontBase 
    { 
        private List<string> font = new List<string>();

        private string fontName; 
        public FontBase(string name) 
        { 
            this.fontName = name; 
        }

        public FontBase AddFont(string font) 
        { 
            this.font.Add(font); 
            return this; 
        } 
        public virtual string FontName 
        { 
            get 
            { 
                return this.fontName; 
            } 
        } 
    }

    具体的文字类型类:

    public class ChineseFont : FontBase 
    { 
        public ChineseFont() 
            : base("ChineseFont") 
        { 
            base.AddFont("ChineseFont"); 
        } 
    }

    public class EnglishFont : FontBase 
    { 
        public EnglishFont() 
            : base("EnglishFont") 
        { 
            base.AddFont("EnglishFont"); 
        } 
    }

具体的创建工厂类:

    public class FontFactory 
    { 
        private  Dictionary<string, FontBase> fonts = new Dictionary<string, FontBase>();

        public  FontBase Create(string name) 
        { 
            FontBase fontBase = fonts[name]; 
            if (fontBase != null) 
                return fontBase;

            fontBase = (FontBase)Activator.CreateInstance(Type.GetType(name));

            return fontBase; 
        } 
    }

通过上面实例的讲解我们知道,我们通过缓存对象类型的形式来控制对象实例的创建过程,经典的模式中没有体现共享的状态,比如说我们在外部可能对于
享元对象来说是不共享的,内部是共享的。下面我们来看看享元模式的变种吧。

转载:
设计模式系列-享元模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值