享元模式

一、定义

运用共享技术有效地支持大量细粒度的对象。

二、适用场景

  • 系统会用到大量相同或相似的对象。
  • 对象创建比较耗时。

三、目的

  • 减少创建对象的数量。
  • 对象全局共享。

四、UML类图

  • FlyweightFactory:享元工厂,用来创建并管理Flyweight对象
  • Flyweight:享元类的基类或接口
  • ConcreteFlyweight:具体的Flyweight子类
  • UnsharedConcreteFlyweight:不需要共享的Flyweight子类

五、应用实例

字符串驻留池、线程池、数据库连接池等。

六、优缺点

优点

  • 节省内存空间
  • 提高效率

缺点

          增加了系统的复杂度。

七、与单例模式的区别

  • 享元模式是共享大量类的大量实例,而单例是一个类一个实例。

  • 单例模式针对的是对象的创建,而享元模式针对的是对象的管理。

  • 单例模式不能单独创建,而享元模式可以单独创建。

八、与简单工厂模式的区别

  • 享元模式在简单工厂模式的基础上加入了缓存。
  • 简单工厂模式的作用仅仅是创建对象,而享元模式虽然也创建对象,但其主要作用是管理对象。

九、示例

1.Typeface.cs

public abstract class Typeface
    {
        public abstract string Print();
    }

2.WordTypeface.cs

public class WordTypeface : Typeface
    {
        private readonly string _word;

        public WordTypeface(string word)
        {
            this._word = word;
        }

        public override string Print()
        {
            return this._word;
        }
    }

3.TypefaceFactory.cs

public class TypefaceFactory
    {
//这也可以用redis存
private static readonly IDictionary<string, Typeface> _typefaces = new Dictionary<string, Typeface>(); private static readonly object _locker = new object(); public static void SetTypeface(string key, Typeface typeface) { if (!_typefaces.ContainsKey(key)) { lock (_locker) { if (!_typefaces.ContainsKey(key)) { _typefaces.Add(key, typeface); } } } } public static Typeface GetTypeface(string key) { if (_typefaces.ContainsKey(key)) { return _typefaces[key]; } return null; } }

4.Program.cs

 internal class Program
    {
        static void Main(string[] args)
        {            
            TypefaceFactory.SetTypeface("hello", new WordTypeface("你好"));

            Console.WriteLine(TypefaceFactory.GetTypeface("hello").Print());
        }
    }

运行结果:你好

 

posted on 2023-05-31 11:13  一只向上爬的小蜗牛  阅读(21)  评论(0编辑  收藏  举报