结构型设计模式——享元模式

运用共享技术有效地支持大量细粒度对象,减少大量相似对象的创建,从而降低内存消耗并提升系统性能。其核心思想是分离对象的内部状态(可共享)和外部状态(不可共享),通过复用内部状态实现对象的高效管理。

适用于

①一个应用程序使用了大量的对象。

②完全由于使用大量的对象,造成很大的存储开销。

③对象的大多数状态都可变为外部状态。

④如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

⑤应用程序不依赖于对象标识。由于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     }
View Code
 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     }
View Code
1     /// <summary>
2     /// 享元抽象接口
3     /// 公共部分
4     /// </summary>
5     internal interface Shape
6     {
7         public void Display();
8     }
View Code
 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     }
View Code
posted @ 2025-04-15 21:45  是铭不是明  阅读(19)  评论(0)    收藏  举报