享元模式
一、定义
运用共享技术有效地支持大量细粒度的对象。
二、适用场景
- 系统会用到大量相同或相似的对象。
- 对象创建比较耗时。
三、目的
- 减少创建对象的数量。
- 对象全局共享。
四、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()); } }
运行结果:你好