看了这个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;
}
效果: