享元模式(Flyweight Pattern)是一种结构型设计模式,用于在系统中共享大量相似对象,以减少内存占用和提高性能。享元模式通过共享相同或相似的对象,避免了创建过多的对象实例,从而降低了系统的开销。
以下是一个使用C#语言实现的享元模式的示例:
假设我们有一个图形绘制系统,需要绘制大量的圆形对象。每个圆形对象具有相同的属性和行为,只是位置和大小不同。为了优化性能和减少内存占用,我们可以使用享元模式来共享这些相似对象。
using System; using System.Collections.Generic; namespace FlyweightPatternExample { // 圆形对象接口 public interface ICircle { void Draw(); } // 具体圆形对象类 public class ConcreteCircle : ICircle { private int _x; private int _y; private int _radius; public ConcreteCircle(int x, int y, int radius) { _x = x; _y = y; _radius = radius; } public void Draw() { Console.WriteLine($"Drawing circle at ({_x}, {_y}) with radius {_radius}"); } } // 圆形对象享元工厂类 public class CircleFlyweightFactory { private Dictionary<string, ICircle> _circlePool; public CircleFlyweightFactory() { _circlePool = new Dictionary<string, ICircle>(); } public ICircle GetCircle(int x, int y, int radius) { string key = $"{x}_{y}_{radius}"; // 根据对象的属性值生成唯一的键 if (!_circlePool.ContainsKey(key)) // 如果对象不存在于池中,则创建并添加到池中 { _circlePool[key] = new ConcreteCircle(x, y, radius); } return _circlePool[key]; // 返回池中的对象实例 } } }
使用示例:
class Program { static void Main(string[] args) { CircleFlyweightFactory factory = new CircleFlyweightFactory(); // 创建享元工厂对象 ICircle circle1 = factory.GetCircle(100, 100, 50); // 获取或创建圆形对象实例1(x=100, y=100, radius=50) circle1.Draw(); // 绘制圆形对象实例1,输出结果:Drawing circle at (100, 100) with radius 50 ICircle circle2 = factory.GetCircle(200, 200, 50); // 获取或创建圆形对象实例2(x=200, y=200, radius=50) circle2.Draw(); // 绘制圆形对象实例2,输出结果:Drawing circle at (200, 200) with radius 50 ICircle circle3 = factory.GetCircle(100, 100, 50); // 获取或创建圆形对象实例3(x=100, y=100, radius=50),与实例1属性值相同,应该返回同一个实例 circle3.Draw(); // 绘制圆形对象实例3,输出结果:Drawing circle at (100, 100) with radius 50,与实例1的输出结果相同,证明是同一个实例。 Console.ReadLine(); // 等待用户输入,防止程序直接退出。 } }
在上面的示例中,我们创建了一个圆形对象享元工厂类CircleFlyweightFactory
,
它内部维护了一个存储圆形对象的池。
当客户端请求获取或创建一个圆形对象时,工厂类会根据对象的属性值生成一个唯一的键,
并在池中查找是否存在具有相同属性的对象。
如果找到了,则返回该对象的引用;
如果没有找到,则创建一个新的对象添加到池中,并返回该对象的引用。
这种方式实现了对相似对象的共享,减少了内存占用并提高了性能。

