【c++设计模式】享元模式

结构型模式

12)享元模式

本文主要参考

http://www.aspku.com/kaifa/c/308355.html

享元模式通过复用对象来创建更小的对象组。
举个例子,享元模式可以看成一个工具箱,而享元对象就是工具箱内的具体工具。在使用工具的时候不必没回都临时制造工具,而是直接从工具箱中找到工具并使用,这样就节省了工具的成本和占用的空间。

对象的状态分为内蕴状态和外蕴状态。内蕴状态是对象本身的属性,在生成对象后一般不会改变,例如工具的名字大小重量等。但外蕴状态是对象的外部状态,是每个对象的可变部分,比如对工具的使用地点、使用时间、使用人和工作内容的描述,这些属性不属于工具本身,而是根据每回使用情况调用的,这就需要做成对外接口让外部进行调用,而外蕴状态是由调用者维护的,对象内不进行维护。

享元工厂是实现享元模式的关键。

一般来说享元模式包括两个角色:
第一种,享元类,抽象类。
第二种,享元工厂,非抽象类。

//享元类
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 ");
    
}

运行结果为:

posted @ 2019-12-11 21:08  corineru  阅读(173)  评论(0编辑  收藏  举报