建造者设计模式

看了这个Java实现: http://blog.youkuaiyun.com/lfdfhl/article/details/77851646

用C++练习下.

#include <iostream>
#include <string>
#include <utility>

using namespace std;

/*
    产品类
*/
struct Fruit{
    string color;
    string name;
    int weight;

    friend ostream& operator<< (ostream& out, const Fruit& obj){
        out << "name: "  << obj.name
            << "\ncolor: "  << obj.color
            << "\nweight: " << obj.weight;
        
            return out;
    }
};

/*
    建造者蓝本    
*/
class AbstractBuilder{
public:
    virtual void setColor(const string& color) = 0;
    virtual void setName(const string& name) = 0;
    virtual void setWeight(int w) = 0;
    virtual Fruit* create() = 0;
    virtual ~AbstractBuilder(){};
};

/*
    具体建造者
*/
class ConcreteBuilder: public AbstractBuilder{
    Fruit* fruit = new Fruit;
public:
    virtual ~ConcreteBuilder(){delete fruit; cout << "dector.\n";}
    virtual void setColor(const string& color) override{
        fruit->color = std::move(color);
    }

    virtual void setName(const string& name) override{
        fruit->name = std::move(name);
    }

    virtual void setWeight(int w) override{
        fruit->weight = w;
    }

    virtual Fruit* create() override{
        return fruit;
    }
};

/*
    导演类
*/
class FruitDirector{
    AbstractBuilder* builder = nullptr;
public:
    FruitDirector(AbstractBuilder* builder){
        this->builder = builder;
    }

    Fruit* createFruit(const string& color, const string& name, int weight){
        builder->setColor(color);
        builder->setName(name);
        builder->setWeight(weight);
        
        return builder->create();
    }
};

int main(){

    // 按要求招聘设计师, 该设计师要会调配颜色/给水果取艺名/会称重...好吧,例子不太好 ^_^
    AbstractBuilder* builder = new ConcreteBuilder;
    // 临时导演指挥设计师设计一个特定水果来......
    Fruit* fruit = (new FruitDirector(builder))->createFruit("Red", "Apple", 250);
    cout << *fruit << endl;
    delete builder;

    return 0;
}

效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值