【c++设计模式】享元模式
结构型模式
12)享元模式
本文主要参考
享元模式通过复用对象来创建更小的对象组。
举个例子,享元模式可以看成一个工具箱,而享元对象就是工具箱内的具体工具。在使用工具的时候不必没回都临时制造工具,而是直接从工具箱中找到工具并使用,这样就节省了工具的成本和占用的空间。
对象的状态分为内蕴状态和外蕴状态。内蕴状态是对象本身的属性,在生成对象后一般不会改变,例如工具的名字大小重量等。但外蕴状态是对象的外部状态,是每个对象的可变部分,比如对工具的使用地点、使用时间、使用人和工作内容的描述,这些属性不属于工具本身,而是根据每回使用情况调用的,这就需要做成对外接口让外部进行调用,而外蕴状态是由调用者维护的,对象内不进行维护。
享元工厂是实现享元模式的关键。
一般来说享元模式包括两个角色:
第一种,享元类,抽象类。
第二种,享元工厂,非抽象类。
//享元类
class Tool{
public:
//内蕴状态
string name;
int nsize;
int nWight;
//外蕴状态
virtual void used(string person, string work) = 0;
};
class hammer : public Tool{
public:
hammer(){
name = "hammer";
}
void used(string person, string work){
cout<<person<<" use "<<name<<" to "<<work<<endl;
}
};
class screwDriver : public Tool{
public:
screwDriver(){
name = "screwDriver";
}
void used(string person, string work){
cout<< person <<" use "<<name <<" to "<<work<<endl;
}
};
//享元工具类
class toolbox{
private:
map<string,Tool*> m_tool;
public:
toolbox(){}
~toolbox(){
map<string, Tool*>::iterator it;
for(it=m_tool.begin();it!=m_tool.end();it++){
if(it->second!=NULL)
delete it->second;
}
}
Tool* getTool(string toolname){
map<string, Tool*>::iterator it = m_tool.find(toolname);
if(it!=m_tool.end())
return (Tool*)it->second;
else
{
Tool* tooltemp = NULL;
if(toolname=="hammer")
tooltemp = new hammer();
else if(toolname=="screwdriver")
tooltemp = new screwDriver();
if(tooltemp!=NULL)
m_tool.insert(make_pair(toolname, tooltemp));
return tooltemp;
}
}
};
int main(){
toolbox* box = new toolbox();
string p1 = "zhangsan";
string p2 = "lisi";
Tool* t1 = box->getTool("hammer");
Tool* t2 = box->getTool("screwdriver");
t1->used(p1, " make desk ");
t2->used(p2, " repair bike ");
}
运行结果为: