建造者模式属于创建型模式
适用于:
- 需要生成的产品对象有复杂的内部结构
- 需要生成的产品对象的属性相互依赖
- 对象的创建过程独立于创建该对象的类
- 隔离复杂对象的创建和使用
模式优点:
- 将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象
- 每一个剧吐建造者都相对独立,与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,拓展方便,符合开闭原则
- 可以更加精细的控制产品的创建过程
模式缺点:
- 建造者模式所创建的产品一边具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适用创建者模式
类图:
#include<iostream>
#include <string>
using namespace std;
class Product{
public:
string PartA,PartB,PartC;
};
class Builder{
public:
Product product;
virtual string getBuilderPartA() = 0;
virtual string getBuilderPartB() = 0;
virtual string getBuilderPartC() = 0;
virtual void setBuilderPartA(string data) = 0;
virtual void setBuilderPartB(string data) = 0;
virtual void setBuilderPartC(string data) = 0;
};
class ConcreteBuilder:public Builder{
public:
string getBuilderPartA();
string getBuilderPartB();
string getBuilderPartC();
void setBuilderPartA(string data);
void setBuilderPartB(string data);
void setBuilderPartC(string data);
};
void ConcreteBuilder::setBuilderPartA(string data){ product.PartA = data;}
void ConcreteBuilder::setBuilderPartB(string data){ product.PartB = data;}
void ConcreteBuilder::setBuilderPartC(string data){ product.PartC = data;}
string ConcreteBuilder::getBuilderPartA(){ return product.PartA;}
string ConcreteBuilder::getBuilderPartB(){ return product.PartB;}
string ConcreteBuilder::getBuilderPartC(){ return product.PartC;}
class ConcreteBuilder2:public Builder{
public:
string getBuilderPartA();
string getBuilderPartB();
string getBuilderPartC();
void setBuilderPartA(string data);
void setBuilderPartB(string data);
void setBuilderPartC(string data);
};
void ConcreteBuilder2::setBuilderPartA(string data){ product.PartA = data;}
void ConcreteBuilder2::setBuilderPartB(string data){ product.PartB = data;}
void ConcreteBuilder2::setBuilderPartC(string data){ product.PartC = data;}
string ConcreteBuilder2::getBuilderPartA(){ return product.PartA;}
string ConcreteBuilder2::getBuilderPartB(){ return product.PartB;}
string ConcreteBuilder2::getBuilderPartC(){ return product.PartC;}
class Director{
public:
void Construct(Builder *builder);
};
void Director::Construct(Builder *builder){
cout << "This is Construct" << endl;
builder->setBuilderPartA("A");
builder->setBuilderPartB("B");
builder->setBuilderPartC("C");
cout << builder->getBuilderPartA() << endl;
cout << builder->getBuilderPartB() << endl;
cout << builder->getBuilderPartC() << endl;
}
int main(){
Director director;
Builder *builder = new ConcreteBuilder();
director.Construct(builder);
builder = new ConcreteBuilder2();
director.Construct(builder);
return 0;
}