建造者模式
将一个复杂的对象的构建与它的具体表示相隔离,使得同样的构建过程可以创建 不同的复杂的对象
角色扮演
抽象建造者(Builder)
为创建一个产品对象的各个部件指定的抽象接口
具体建造者类(ConcreteBuilder)
实现Builder的接口来构造和装配该产品的各个部件,定义并明确所创建的表示,并提供一个检索产品的接口
指挥建筑者类(DirectorBuiler)
构造一个实用Builder接口的对象
具体的复杂对象类(Product)
表示被构造的复杂对象,ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
举例说明
小王去电脑城买一台组装电脑,对于小王来讲我只需要一台他所需要的电脑,而不关乎其电脑的构造过程,只需要把小王指定的电脑表现出来即可,电脑本身是一个实体,而建造者看来是一个复杂的对象
class Builder
{
public:
Builder();
virtual ~Builder();
virtual void cpu()= 0;
virtual void memeory()=0;
virtual void disk()=0;
virtual void mainboard()=0;
virtual void crate()=0;
virtual void display_board()=0;
virtual void power()=0;
protected:
private:
};
class ConcreteBuilder : public Builder
{
public:
ConcreteBuilder();
virtual ~ConcreteBuilder();
void crate(){
cout<<"制冷机箱全面升级"<<endl;
}
void mainboard(){
cout<<"主板是Z370超频主板"<<endl;
}
void cpu(){
cout<<"采用英特尔酷睿i7八代处理器-i7-8700k"<<endl;
}
void memeory(){
cout<<"内存容量16G,最大32G"<<endl;
}
void disk(){
cout<<"512G固态硬盘,2Tb的机械硬盘"<<endl;
}
void display_board(){
cout<<"独显RTX2080Ti 11G"<<endl
class DirectorBuilder
{
public:
DirectorBuilder();
virtual ~DirectorBuilder();
void createProduct(Builder& be){
be.crate();
be.mainboard();
be.cpu();
be.display_board();
be.memeory();
be.disk();
be.power();
}
protected:
private:
};
class Product
{
public:
Product();
virtual ~Product();
void show(DirectorBuilder &dire,Builder& be){
dire.createProduct(be);
}
protected:
private:
};
demo:
int main(){
DirectorBuilder direc;
ConcreteBuilder cb;
Product *pro =new Product();
return 0;
}
结果:
优点
1:建造者独立,易扩展
2.:无需关系复杂对象的建造过程,可以具体表现出来
3:便于控制细节风险
缺点
1.产品必须有共同点,范围因此有限制
2.如背部变化复杂,则可能具有很多的建造类,使其内部更复杂化
应用场景
需要生产的对象,内部具有复杂的结构
需要生产的对象,内部属性本身具有相互的联系,依赖