zoukankan      html  css  js  c++  java
  • 【c++设计模式】建造者模式

    创建型模式

    4)建造者模式

    一共涉及到三个类:产品类,建造者类,用户类

    • 产品类:非抽象类。就是指某种产品,产品有一些属性待设定
    • 建造者类:需要构造抽象类,来扩展出各种各样的建造者类,每一种产品对应着一种建造者类。并且建造类能够直接生产产品类(能够 new product())
    • 用户类:非抽象类。用户调用不同的建造者类去建造,并且得到相应的产品。用户类和产品类没有直接的关系。

    优点:将一个复杂对象的构造和它的表示分离。这样易于扩展。
    缺点:如果构建发生变化,所有的建造者都要变化。

    class Juice{
    public:
        Juice(){}
        void setVolume(double v){
            m_volume = v;
        }
        void setColor(string color){
            m_color = color;
        }
        
    private:
        double m_volume;
        string m_color;
    };
    
    //建造者抽象类
    class Maker{
    public:
        Maker():p_juice(NULL){}
        void createJuice(){
            if(p_juice==NULL)
                p_juice = new Juice();
        }
        Juice* getJuice(){
            return p_juice;
        }
        
        virtual void squeezeVolume() = 0;
        virtual void mixColor() = 0;
        
    protected:
        Juice* p_juice;
    };
    
    class GrapeJuiceMaker : public Maker{
    public:
        GrapeJuiceMaker():Maker(){}
        void squeezeVolume(){
            p_juice->setVolume(1000);
        }
        
        void mixColor(){
            p_juice->setColor("Purple");
        }
    };
    
    class AppleJuiceMaker: public Maker{
    public:
        AppleJuiceMaker():Maker(){}
        void squeezeVolume(){
            if(p_juice!=NULL)
                p_juice->setVolume(500);
        }
        
        void mixColor(){
            if(p_juice!=NULL)
                p_juice->setColor("Green");
        }
    };
    
    //用户类
    class Worker{
    public:
        Worker():m_maker(NULL){}
        void setMaker(Maker* m){
            m_maker = m;
        }
        Juice* makeJuice(){
            if(m_maker==NULL)
                return NULL;
            m_maker->createJuice();
            m_maker->squeezeVolume();
            m_maker->mixColor();
            
            Juice* p_juice = m_maker->getJuice();
            return p_juice;
        }
    private:
        Maker* m_maker;
    };
    
    int main(){
        
        Worker* w = new Worker(); //定义工人
        Maker* maker1 = new AppleJuiceMaker(); //定义机器
        w->setMaker(maker1);
        Juice* a1 = w->makeJuice(); //就能直接得到果汁
    }
    
    

    本文参考

    https://www.jianshu.com/p/8c97cdae98b1

  • 相关阅读:
    Android 调用浏览器和嵌入网页
    Android Fragment间对象传递
    Android Volley获取json格式的数据
    git无法clone远程代码库及git代理设置
    Android Studio在线安装Android SDK注意事项
    【转】如何修改Chrome缓存目录的地址
    【转】MySQL Temporary Table相关问题的探究
    Android读写assets、raw、sdard和工程文件的方法
    Android简易数据存储之SharedPreferences
    (转) Deep Learning in a Nutshell: Core Concepts
  • 原文地址:https://www.cnblogs.com/corineru/p/12000934.html
Copyright © 2011-2022 走看看