享元模式(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,
它内部维护了一个存储圆形对象的池。
当客户端请求获取或创建一个圆形对象时,工厂类会根据对象的属性值生成一个唯一的键,
并在池中查找是否存在具有相同属性的对象。
如果找到了,则返回该对象的引用;
如果没有找到,则创建一个新的对象添加到池中,并返回该对象的引用。
这种方式实现了对相似对象的共享,减少了内存占用并提高了性能。


少有人走的路



















