定义
享元模式(FlyweightPattern)运用共享技术有效地支持大量细粒度的对象。
享元模式通用类图
Flyweight——抽象享元角色
就是一个产品的抽象类,同事定义出对象的外部状态和内部状态的接口或实现。
ConcreteFlyweight——具体享元角色
具体的一个产品类,实现抽象角色定义的业务。该角色中需要注意的是内部状态处理应该与环境无关,不应该出现一个操作改变了内部状态,同时修改了外部状态,这是绝对不允许的。
unsharedConcreteFlyweight——不可共享的享元角色
不存在外部状态或者安全要求(如线程安全)不能够使用共享技术的对象,该对象一般不会出现在享元工厂中。
FlyweightFactory——享元工厂
职责非常简单,就是构造一个池容器,同事提供从池中获得对象的方法。
享元模式的优点和缺点
享元模式是一个非常简单的模式,它可以大大减少应用程序创建的对象,降低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分离出外部状态和内部状态,而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱。
通用源代码
#include <iostream>
#include <string>
#include <map>
using namespace std;
class Flyweight //抽象享元角色
{
protected:
string intrinsic; //内部状态
public:
Flyweight(string intri):intrinsic(intri){};
virtual void Operation(int extrinsicState)=0; //extrinsicState 为外部状态
};
class ConcreteFlyweight:public Flyweight{ //具体享元角色
public:
ConcreteFlyweight(string intri):Flyweight(intri){};
void Operation(int extrinsicState)
{
cout<<"具体享元对象:"<<'\n'
<<"\t内部状态:"<<intrinsic<<'\n'
<<"\t外部状态:"<<extrinsicState<<endl;
}
};
class unshareConcreteFlyweight:public Flyweight{
public:
unshareConcreteFlyweight(string intri):Flyweight(intri){};
void Operation(int extrinsicState)
{
cout<<"不共享的具体享元对象:"<<'\n'
<<"\t内部状态:"<<intrinsic<<'\n'
<<"\t外部状态:"<<extrinsicState<<endl;
}
};
class FlyweightFactory{
private:
map<string,Flyweight *> flyweights;
public:
FlyweightFactory()
{
flyweights.insert(make_pair("X",new ConcreteFlyweight("X")));
flyweights.insert(make_pair("Y",new ConcreteFlyweight("Y")));
flyweights.insert(make_pair("Z",new ConcreteFlyweight("Z")));
}
Flyweight *getFlyweight(string key)
{
map<string,Flyweight *>::iterator iter = flyweights.find(key);
if(iter != flyweights.end())
return iter->second;
else
return NULL;
}
};
int main()
{
int extrinsicState = 22;
FlyweightFactory f;
Flyweight *fw = f.getFlyweight("X");
fw->Operation(--extrinsicState);
fw = f.getFlyweight("Y");
fw->Operation(--extrinsicState);
fw = f.getFlyweight("Z");
fw->Operation(--extrinsicState);
unshareConcreteFlyweight uf("UF");
uf.Operation(--extrinsicState);
return 0;
}
运行结果: