结构型设计模式——享元模式
运用共享技术有效地支持大量细粒度对象,减少大量相似对象的创建,从而降低内存消耗并提升系统性能。其核心思想是分离对象的内部状态(可共享)和外部状态(不可共享),通过复用内部状态实现对象的高效管理。
适用于
①一个应用程序使用了大量的对象。
②完全由于使用大量的对象,造成很大的存储开销。
③对象的大多数状态都可变为外部状态。
④如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
⑤应用程序不依赖于对象标识。由于Flyweight对象可以被共享,所以对于概念上明显有别的对象,标识测试将返回真值。
类图如下

1 static void Main(string[] args) 2 { 3 4 Shape circle = FlyWeightFactory.GetFlyWeightFactory().GetShape("圆形"); 5 circle.Display(); 6 7 Shape spuare = FlyWeightFactory.GetFlyWeightFactory().GetShape("矩形"); 8 spuare.Display(); 9 10 Shape spuare1 = FlyWeightFactory.GetFlyWeightFactory().GetShape("矩形"); 11 12 spuare1.Display(); 13 //验证返回的对象是否是相同的 14 Console.WriteLine($"spuare == spuare1 ? {spuare == spuare1}"); 15 }
1 /// <summary> 2 /// 创建并且管理享元对象 3 /// 用户请求Flyweight对象时,返回一个创建的实例或者在不存在时创建一个实例 4 /// </summary> 5 internal class FlyWeightFactory 6 { 7 private Dictionary<string, Shape> shapes; 8 //单例模式 9 private static FlyWeightFactory Fcatory = new FlyWeightFactory(); 10 11 private FlyWeightFactory() 12 { 13 shapes = new Dictionary<string, Shape>(); 14 shapes.Add("圆形", new Circle("圆形", "红色")); 15 shapes.Add("矩形", new Square("矩形", "我是特殊的矩形,我叫正方形")); 16 } 17 18 public static FlyWeightFactory GetFlyWeightFactory() 19 { 20 return Fcatory; 21 } 22 23 public Shape GetShape(string name) 24 { 25 return shapes[name]; 26 } 27 }
1 /// <summary> 2 /// 具体享元对象,实现享元,拥有自己的外部状态 3 /// </summary> 4 internal class Square : Shape 5 { 6 private string Name; 7 8 private string Desc; 9 public Square(string name, string desc) 10 { 11 Name = name; 12 Desc = desc; 13 } 14 15 public void Display() 16 { 17 Console.WriteLine($"我是{Name}对象,{Desc}"); 18 } 19 }
1 /// <summary> 2 /// 享元抽象接口 3 /// 公共部分 4 /// </summary> 5 internal interface Shape 6 { 7 public void Display(); 8 }
1 /// <summary> 2 /// 具体享元对象,实现享元,拥有自己的外部状态 3 /// </summary> 4 internal class Circle : Shape 5 { 6 private string Name; 7 8 private string Color; 9 public Circle(string name, string color) 10 { 11 Name = name; 12 Color = color; 13 } 14 15 public void Display() 16 { 17 Console.WriteLine($"我是{Name}对象,我的颜色是{Color}"); 18 } 19 }

浙公网安备 33010602011771号