享元模式是一种结构型设计模式,它允许你在消耗少量内存的情况下支持大量对象。如果你需要生成大量细粒度的类实例来表示数据,而这些实例除了几个参数外基本上都是相同的,那么你可以使用享元模式来 避免大量相似类的开销。
在享元模式中,有两种状态:内部状态和外部状态。内部状态是存储在享元对象内部的,而外部状态则是在享元对象外部存储的。在使用享元模式时,你可以共享内部状态,而将外部状态作为参数传递给享元对象。
csharp// 抽象享元类
abstract class Flyweight
{
public abstract void Operation(int extrinsicState);
}
csharp// 具体享元类
class ConcreteFlyweight : Flyweight
{
private readonly string _intrinsicState;
public ConcreteFlyweight(string intrinsicState)
{
_intrinsicState = intrinsicState;
}
public override void Operation(int extrinsicState)
{
// 输出内部状态和外部状态
Console.WriteLine("Intrinsic State = " + _intrinsicState);
Console.WriteLine("Extrinsic State = " + extrinsicState);
}
}
csharp// 享元工厂类
class FlyweightFactory
{
private readonly Dictionary<string, Flyweight> _flyweights = new Dictionary<string, Flyweight>();
public Flyweight GetFlyweight(string key)
{
if (_flyweights.ContainsKey(key))
{
// 如果已经存在该享元对象,则直接返回该对象
return _flyweights[key];
}
else
{
// 如果不存在,则创建一个新的享元对象,并存储在对象池中
var flyweight = new ConcreteFlyweight(key);
_flyweights.Add(key, flyweight);
return flyweight;
}
}
}
在这个例子中,我们创建了一个抽象的享元类Flyweight
,一个具体的享元类ConcreteFlyweight
和一个享元工厂类FlyweightFactory
。
在FlyweightFactory
中,我们使用了一个Dictionary
来存储享元对象。在GetFlyweight
方法中,我们首先检查Dictionary
中是否已经存在了一个享元对象。如果存在,我们就返回这个对象。否则,我们就创建一个新的享元对象,并将其添加到Dictionary
中。
可以这样调用:
csharpFlyweightFactory factory = new FlyweightFactory();
Flyweight flyweight1 = factory.GetFlyweight("A");
flyweight1.Operation(1);
Flyweight flyweight2 = factory.GetFlyweight("B");
flyweight2.Operation(2);
Flyweight flyweight3 = factory.GetFlyweight("A");
flyweight3.Operation(3);
输出:
csharpIntrinsic State = A
Extrinsic State = 1
Intrinsic State = B
Extrinsic State = 2
Intrinsic State = A
Extrinsic State = 3
从输出中就可以看出,享元A的内部状态是共享的,Operation
更新的只是外部状态。
享元模式所带来的优势:
本文作者:Peter.Pan
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!