# include <iostream>
# include <string>
using namespace std;
//具体的产品,创建产品需要两个步骤,1、获取名称;2、获取型号
class Product {
public:
void getName(string name) {name_ = name;} //获取名称
void getType(string type) {type_ = type;} //获取型号
void show() { //展示产品
cout << "名称:" << name_ << "\t型号:" << type_ << endl;
}
private:
string name_; //名称
string type_; //型号
};
//抽象建造者
class AbsBuilder {
public:
virtual Product getProduct() = 0; //获取一个产品
virtual void scanName() = 0; //输入名称
virtual void scanType() = 0; //输入型号
};
//具体建造者,具体建造者依赖产品,具体建造者中使用类Product类
class Builder : public AbsBuilder {
public:
virtual Product getProduct() {
return product_;
};
virtual void scanName() {
string name;
cout << "请输入产品名称:" ;
cin >> name;
product_.getName(name);
}
virtual void scanType() {
string type;
cout << "请输入产品型号:" ;
cin >> type;
product_.getType(type);
}
private:
Product product_;
};
//导演,导演聚合建造者,即建造者是导演的一部分。
//construct负责走建造流程。
class Director {
public:
Director(AbsBuilder *abs_builder)
: abs_builder_(abs_builder) {}
void construct() {
abs_builder_->scanName();
abs_builder_->scanType();
}
private:
AbsBuilder *abs_builder_;
};
int main()
{
Builder b; //建造者实例
Director d(&b); //导演实例,导演聚合建造者
d.construct(); //导演走建造流程
Product p = b.getProduct(); //建造者返回导演建造后的对象
p.show(); //展示对象(产品)
}