当一个对象的构造过程比较复杂、需要分成若干步骤来完成时,可以考虑使用建造者模式(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 只是一个 组装