享元模式(Flyweight Pattern)是一种用于性能优化的模式,其核心是运用共享技术来有效支持大量细粒度的对象。享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类实例来表示数据。如果能发现这些实例除了几个参数外基本上都是相同的,有时就能够大幅度地减少需要实例化的类的数量。如果能把那些参数移到类实例的外面,在方法调用时传递进来,就可以通过共享大幅度地减少单个实例的数目。
享元模式的主要有以下角色:
抽象享元对象
public interface IFlyweight
{
void Operation(int extrinsicstate);
}
具体享元
public class ConcreteFlyweight : IFlyweight
{
public void Operation(int extrinsicstate)
{
Console.WriteLine("具体Flyweight:" + extrinsicstate);
}
}
非享元
public class UnsharedConcreteFlyweight : IFlyweight
{
public void Operation(int extrinsicstate)
{
Console.WriteLine("不共享的具体Flyweight:" + extrinsicstate);
}
}
享元工厂
享元工厂负责创建和管理享元对象。
在这个工厂类中,有一个Hashtable类型的私有成员变量flyweights,它用于存储享元对象。在构造函数中,我们向这个Hashtable中添加了三个ConcreteFlyweight对象,并且为每一个对象指定了一个唯一的键值。然后,这个工厂类提供了一个GetFlyweight方法,这个方法接受一个字符串类型的键值作为参数,然后从Hashtable中取出对应的享元对象并返回。
所以,这段代码的主要作用就是创建和管理享元对象,当需要一个享元对象时,只需要调用GetFlyweight方法并传入对应的键值即可。这样就可以实现享元对象的共享,避免了大量相似对象的创建,从而节省了系统资源。
public class FlyweightFactory
{
private Hashtable flyweights = new Hashtable();
public FlyweightFactory()
{
flyweights.Add("X", new ConcreteFlyweight());
flyweights.Add("Y", new ConcreteFlyweight());
flyweights.Add("Z", new ConcreteFlyweight());
}
public IFlyweight GetFlyweight(string key)
{
return ((IFlyweight)flyweights[key]);
}
}
测试类
class MyClass
{
public static void Main(string[] args)
{
FlyweightFactory f = new FlyweightFactory();
IFlyweight fx = f.GetFlyweight("X");
fx.Operation(1);
IFlyweight fy = f.GetFlyweight("Y");
fy.Operation(2);
IFlyweight fz = f.GetFlyweight("Z");
fz.Operation(3);
UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
uf.Operation(4);
}
}
运行结果
在这个案例中我们使用哈希表(Hashtable)来实现,创建一个哈希表并将对象放入其中。其中键是对象的外部状态,值是对应的享元对象。当需要使用对象时,可以从哈希表中获取已经创建的享元对象。