zoukankan      html  css  js  c++  java
  • 【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 ");
        
    }
    
    

    运行结果为:

  • 相关阅读:
    【转载】C/C++中extern关键字详解
    【转载】extern "C"的用法解析(原博主就是抄百度百科的,不如另外一篇好)
    lua Date和Time
    MySQL-Linux安装
    Hive-0.13安装
    MR案例:单表关联查询
    MR案例:小文件处理方案
    MR案例:链式ChainMapper
    MR案例:定制Partitioner
    MR案例:多文件输出MultipleOutputs
  • 原文地址:https://www.cnblogs.com/corineru/p/12025140.html
Copyright © 2011-2022 走看看