您的位置:首页 > 其它

建造者设计模式

2017-09-07 01:25 363 查看
看了这个Java实现: http://blog.csdn.net/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;
}

效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: