当一个对象的构造过程比较复杂、需要分成若干步骤来完成时,可以考虑使用建造者模式(Builder)来处理。
建造者模式的核心思想是:把一个复杂对象的构建过程与它的最终表示分离,使得同样的构建流程可以生成不同的表示形式。
通常的做法是把复杂对象的构建拆成若干个部分,例如 BuildPartA、BuildPartB、BuildPartC 等等,由不同的角色分别负责接口定义、具体实现和装配流程。
角色划分
- Builder:规定构建过程中涉及的一组接口。
- ConCreateBuilder:Builder 的具体实现,负责真正完成每个部件的构建。
- Director:负责具体的装配调用,按既定顺序驱动 Builder 完成构建。
版本 1
第一个版本里,Director 在构造函数中持有一个 Builder 引用,由 Director 自身决定各个部件的装配顺序。
class Procudt
{
public:
void initPartA(){}
void initPartB(){}
void Print(){ cout << __FUNCTION__ << endl; }
};
class Builder
{
public:
virtual void BuildPartA() = 0;
virtual void BuildPartB() = 0;
virtual Procudt* GetProduct() = 0;
};
class ConCreateBuilder :public Builder
{
Procudt *product;
public:
virtual void BuildPartA()override
{
cout << __FUNCTION__ << endl;
product->initPartA();
}
virtual void BuildPartB()override
{
cout << __FUNCTION__ << endl;
product->initPartB();
}
Procudt * GetProduct()override
{
return product;
}
};
class Director
{
public:
Director(Builder *builder)
{
_builder = builder;
}
void Construct()
{
_builder->BuildPartA();
_builder->BuildPartB();
}
Builder* _builder;
};
int main(int argc, char *argv[])
{
ConCreateBuilder* builder = new ConCreateBuilder;
Director* director = new Director(builder);
director->Construct();
builder->GetProduct()->Print();
system("pause");
return 0;
}
版本 2
第二个版本把 Builder 的传入时机从 Director 的构造函数挪到了 Construct 方法的参数上,Director 本身不再持有 Builder,只承担"组装"这个纯粹的动作。
class Director
{
public:
Builder* Construct(Builder *_builder)
{
_builder->BuildPartA();
_builder->BuildPartB();
return _builder;
}
};
int main(int argc, char *argv[])
{
ConCreateBuilder* builder = ;
Director* director = new Director();
Builder *builder = director->Construct(new ConCreateBuilder);
builder->GetProduct()->Print();
system("pause");
return 0;
}
//Director 只是一个 组装