设计模式——享元模式
享元模式,运用共享技术有效地支持大量细粒度的对象
//Flyweight类,它是所有具体共享类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部状态
abstract class Flyweight
{
public abstract void Operation(int extrinsicstate);
}
//ConcreteFlyweight 是继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间
class ConcreteFlyweight : Flyweight
{
public override void Operation(int extrinsicstate)
{
Console.WriteLine("具体Flyweight:"+ extrinsicstate);
}
}
//UnsharedConcreteFlyweight 是指那些不需要共享的Flyweight子类,因为Flyweight接口共享成为可能,但它并不强制共享
class UnsharedConcreteFlyweight : Flyweight
{
public override void Operation(int extrinsicstate)
{
Console.WriteLine("不共享的具体Flyweight:" + extrinsicstate);
}
}
// FlyweightFactory,是一个共享工厂,用来创建并管理Flyweight对象。它主要是用来确保合理地共享Flyweight,
//当用户请求一个Flyweight是,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)
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 Flyweight GetFlyweight(string key)//根据客户端请求,获得已生成的实例
{
return ((Flyweight)flyweights[key]);
}
}
static void Main(string[] args)
{
// Arbitrary extrinsic state
int extrinsicstate = 22;
FlyweightFactory factory = new FlyweightFactory();
// Work with different flyweight instances
Flyweight fx = factory.GetFlyweight("X");
fx.Operation(--extrinsicstate);
Flyweight fy = factory.GetFlyweight("Y");
fy.Operation(--extrinsicstate);
Flyweight fz = factory.GetFlyweight("Z");
fz.Operation(--extrinsicstate);
UnsharedConcreteFlyweight fu = new UnsharedConcreteFlyweight();
fu.Operation(--extrinsicstate);
}