享元模式也称羽量级模式或者蝇级模式。这种模式可以用工具箱来理解。用户可以向工具箱请求工具,工具箱可以提供已经存在的工具对象,或者没有现成的工具对象,就创建一个,可以提供给下次需要的用户。
工具的状态可以分为内部和外部两种,内部状态是工具本身固有的,外部状态与工具的使用场景有关,工具的使用过程可以影响它们。
工具如果能在一定程度上复用,理论上就不用对每一个用户或者每一次使用新创建一个工具对象,这就是这种模式在创建对象这件事上的优化空间。
以下代码定义了“工具”抽象类,intrinicStatus
是内部状态,extrinicStatus
是外部状态。
#include <iostream>
using namespace std;
class FlyWeight
{
protected:
int intrinicStatus;
public:
int extrinicStatus;
virtual void Use(int status)=0;
};
以下代码定义了两种具体的“工具”类。
class FlyWeightA:public FlyWeight
{
public:
FlyWeightA()
{
intrinicStatus = 0;
}
void Use(int status)
{
extrinicStatus = status;
cout<<__PRETTY_FUNCTION__<<endl;
cout<<"in="<<intrinicStatus<<",ex="<<extrinicStatus<<endl<<endl;
}
};
class FlyWeightB:public FlyWeight
{
public:
FlyWeightB()
{
intrinicStatus = 1;
}
void Use(int status)
{
extrinicStatus = status;
cout<<__PRETTY_FUNCTION__<<endl;
cout<<"in="<<intrinicStatus<<",ex="<<extrinicStatus<<endl<<endl;
}
};
以下代码定义了“工具箱”类,用户可以用它得到“工具”。
class FlyWeightFactory
{
private:
FlyWeight* flyWeights[2];
public:
FlyWeightFactory()
{
flyWeights[0]=nullptr;
flyWeights[1]=nullptr;
}
FlyWeight* GetFlyWeight(const int key)
{
if (key >= sizeof(flyWeights)/sizeof(flyWeights[0]) || key < 0)
{
return nullptr;
}
if (flyWeights[key])
{
return flyWeights[key];
}
FlyWeight* flyweight;
switch (key)
{
case 0:
flyweight = new FlyWeightA();
break;
case 1:
flyweight = new FlyWeightB();
break;
default:
break;
}
flyWeights[key] = flyweight;
return flyweight;
}
};
以下代码使用“工具箱”先后获得两个“工具”,并进行了使用。
int main(void){
FlyWeightFactory FWFactory;
FlyWeight* FW0 = FWFactory.GetFlyWeight(0);
FlyWeight* FW1 = FWFactory.GetFlyWeight(1);
FW0->Use('0');
FW1->Use('1');
delete FW0;
delete FW1;
return 0;
}
输出
virtual void FlyWeightA::Use(int)
in=0,ex=48
virtual void FlyWeightB::Use(int)
in=1,ex=49
网友评论