我们知道机器语言识别的只有0和1,我把这两个元素存到一个实例里面,每次使用的时候去调用它,而不是使用的时候直接去new一个对应的对象,这样是非常消耗内存的,我们把这个收藏1和0的容器称之为享元库。
享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用
享元模式的结构
Flyweight(抽象享元类):抽象享元类通常是接口或者抽象类声明具体享元类的公共方法,这些方法可以向外界提供享元对象的内部数据(内部状态),也可以通过这些方法设置外部数据(外部状态)
public interface Flyweight
{
void Operation(string extrinsicState);
}
ConcreteFlyweight(具体享元类):实现抽象享元类,通常称之为享元对象,一般结合单例来设计一个唯一的享元对象。
public class ConcreteFlyweight : Flyweight
{
private string intrinsicState;
public ConcreteFlyweight(string intrinsicState)
{
this.intrinsicState = intrinsicState;
}
public void Operation(string extrinsicState)
{
}
}
UnsharedConcreteFlyweight(非共享具体享元类):不是所有的享元对象都被共享,用户可以将不能被共享的对象设置为非共享元,当需要一个非共享具体享元类的时候可以直接实例化创建
public class UnsharedConcreteFlyweight : Flyweight
{
private string allState;
public void Operation(string extrinsicState)
{
}
}
FlyweightFactory(享元工厂):享元工厂是一个创建管理享元的对象,用户可以直接使用这个享元工厂来调用元素达到复用的效果。一般可以结合工厂模式来进行设计和使用
public class FlyweightFactory
{
public Hashtable flyweight =new Hashtable();
public Flyweight GetFlyweight(string key)
{
if (flyweight.ContainsKey(key))
{
return (Flyweight)flyweight[key];
}
else
{
Flyweight fw = new ConcreteFlyweight("state");
flyweight.Add(key, fw);
return fw;
}
}
}