#include<iostream>
#include<string>
#include<vector>
using namespace std;
//需要完成的最终产品,抽离出来,具体实现流程由builder实现
class Product {
public:
vector<string> partVec;
void add(string part) {
partVec.push_back(part);
}
void show() {
for(int i = 0; i < partVec.size(); i++) {
cout<<partVec[i]<<endl;
}
cout<<endl;
}
};
//可以理解成总览的操作工,提前规划所有需要的分步流程
//纯虚函数是为了提醒后面的具体实现,不能遗忘任何流程
class Builder{
public:
//这里将父类的析构函数写为虚函数,是为了防止当父类指针指向子类对象时,不发生内存泄露
//否则会出现只有父类对象被析构,子类没有成功析构
virtual ~Builder(){}
virtual void produceProductA() const = 0;
virtual void produceProductB() const = 0;
virtual void produceProductC() const = 0;
};
//具体的操作工,完善每一步的操作流程,返回生产出的产品
class ConcreteBuilder : public Builder{
private:
Product* product = new Product();
public:
~ConcreteBuilder(){
delete product;
}
void produceProductA() const override{
product->add("partA");
}
void produceProductB() const override{
product->add("partB");
}
void produceProductC() const override{
product->add("partC");
}
Product* getProduct(){
return this->product;
}
};
//主管,必须给主管安排操作工,统筹所有的套餐种类
class Director{
private:
Builder* m_builder;
public:
void setBuilder(Builder* builder){
this->m_builder = builder;
}
void buildMinProduct(){
this->m_builder->produceProductA();
}
void buildFullProduct(){
this->m_builder->produceProductA();
this->m_builder->produceProductB();
this->m_builder->produceProductC();
}
};
//用户,雇佣主管,给其安排操作工,同样的流程,生产不同的产品,支持用户自定义
//void client(Director& director){
void client(Director director){
ConcreteBuilder* builder = new ConcreteBuilder();
director.setBuilder(builder);
//生产最低套餐
cout<<"minProduct:"<<endl;
director.buildMinProduct();
Product* product = new Product();
product = builder->getProduct();
product->show();
delete product;
//生产最高套餐
cout<<"FullProduct:"<<endl;
director.buildFullProduct();
product = builder->getProduct();
product->show();
delete product;
//生产用户指定套餐
cout<<"customProduct:"<<endl;
builder->produceProductA();
builder->produceProductC();
product = builder->getProduct();
product->show();
delete product;
delete builder;
}
int main()
{
//Director* director = new Director();
//解引用
//client(*director);
Director director;
client(director);
//delete director;
return 0;
}
生成器模式(C++版)
于 2024-03-14 17:44:22 首次发布