【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

原文地址:https://www.cnblogs.com/corineru/p/12000934.html