#include<iostream>
#include<string>
#include<vector>
using namespace std;
class ProductA{
public:
vector<string> contents;
void show()const
{
for(const auto& each : contents){
cout << each << " ";
}
cout << endl;
}
};
class Builder{
public:
virtual void step1()const = 0;
virtual void step2()const = 0;
virtual void step3()const = 0;
virtual ~Builder() { }
};
class ConcreteBuilderA : public Builder{
private:
ProductA *product;
public:
ConcreteBuilderA()
{
reset();
}
void reset()
{
product = new ProductA;
}
~ConcreteBuilderA()
{
delete product;
}
void step1()const override
{
product->contents.push_back("step1");
}
void step2()const override
{
product->contents.push_back("step2");
}
void step3()const override
{
product->contents.push_back("step3");
}
ProductA* getResult()
{
ProductA *ret = product;
reset();
return ret;
}
};
class Director{
private:
Builder* builder;
public:
void setBuilder(Builder* b)
{
builder = b;
}
void buildMinimalProduct()
{
builder->step1();
}
void buildFullFeatureProduct()
{
builder->step1();
builder->step2();
builder->step3();
}
};
void client(Director& d)
{
ConcreteBuilderA *a = new ConcreteBuilderA;
d.setBuilder(a);
cout << "basic product: ";
d.buildMinimalProduct();
ProductA *pa = a->getResult();
pa->show();
delete pa;
cout << "full feature product: ";
d.buildFullFeatureProduct();
pa = a->getResult();
pa->show();
delete pa;
//without a director
cout << "Custom product: ";
a->step1();
a->step3();
pa = a->getResult();
pa->show();
delete pa;
delete a;
}
int main()
{
Director d;
client(d);
return 0;
}