Flyweight Pattern(享元模式)

享元模式的特点是,复用我们内存中已存在的对象,降低系统创建对象实例

的性能消耗

    我们来给出个简单的享元模式的应用前后的对比图,大概我们就知道享元模式的重要作用了。

    我们这里以绘制一个有样式的字体来说明吧,有的时候我们想绘制一个纯色的文字,比如红色,那么我们可能需要创建很多的实例,通常来说,这些

实例的差别不大,这个时候,我们可以考虑复用其中创建的某个实例,而不用去new这么多相同的对象,来完成这样的工作。我们下面以这个例子来说

明,使用享元模式的前后对比的情况。

    使用享元模式前:

    image

    使用享元模式后:

    image

四、享元模式的特点及使用场景

      4.1、享元模式的特点

      享元模式的意图是通过共享有效支持大量细粒度的对象,来提供应用程序的性能,节省系统中重复创建对象实例的性能消耗,这个怎么理解呢?其实就是以下几点的含义:

1、当我们系统中某个对象类型的实例较多的情况。

2、并且要求这些实例进行分类后,发现真正有区别的分类很少的情况。

      例如我们的生活中很多的场景,我们在使用拼音输入的法的时候,如果说我们每个字都是new一个对象实例的操作的话,那么内存中的实例就太可

怕,这个时候,我们是不是可以考虑将这些重复的字体在内存中只是创建一次,而是通过复用对象的形式,来组织一些可能有多个字符重复的内容呢?

也许这是一个不错的主意,我们来看看这个示例的过程吧。

   4.2、享元模式的使用场景

         1、当我们发现某个类型的对象有大量的实例时,我们是否可以对这些实例进行分类,经过分类后,我们发现只有很少的类别的情况下。

         2、我们发现通过使用享元模式后能够提高系统的性能和不会带来更多的复杂度时。

      享元模式一般是给出本地内存资源节省的一个方案,并不适合互联网上的分布式应用的情况,不过享元模式对于排他性的要求资源的控制,是个不

错的选择的。

四、享元模式的特点及使用场景

      4.1、享元模式的特点

      享元模式的意图是通过共享有效支持大量细粒度的对象,来提供应用程序的性能,节省系统中重复创建对象实例的性能消耗,这个怎么理解呢?其实就是以下几点的含义:

1、当我们系统中某个对象类型的实例较多的情况。

2、并且要求这些实例进行分类后,发现真正有区别的分类很少的情况。

      例如我们的生活中很多的场景,我们在使用拼音输入的法的时候,如果说我们每个字都是new一个对象实例的操作的话,那么内存中的实例就太可

怕,这个时候,我们是不是可以考虑将这些重复的字体在内存中只是创建一次,而是通过复用对象的形式,来组织一些可能有多个字符重复的内容呢?

也许这是一个不错的主意,我们来看看这个示例的过程吧。

image

      4.2、享元模式的使用场景

         1、当我们发现某个类型的对象有大量的实例时,我们是否可以对这些实例进行分类,经过分类后,我们发现只有很少的类别的情况下。

         2、我们发现通过使用享元模式后能够提高系统的性能和不会带来更多的复杂度时。

      享元模式一般是给出本地内存资源节省的一个方案,并不适合互联网上的分布式应用的情况,不过享元模式对于排他性的要求资源的控制,是个不

错的选择的。

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;
        }
    }

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

享元对象来说是不共享的,内部是共享的

猜你喜欢

转载自zha-zi.iteye.com/blog/1468704