建造者模式(Builder):将一个复杂对象的构造和它的表示分离,使得同样的构造过程可以创建不用的表示。
建造模式将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程可以生成具有不同内部表象的产品对象,建造者模式使得产品的内部表象可以独立的变化,客户端不用知道产品内部组成的细节。
UML类图:
模式说明:
Builder:
为创建一个产品对象的各个部件指定抽象接口。
ConcreteBuilder:
实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。
Director:
构造一个使用Builder接口的对象。
Product:
表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
建造者模式基本代码:
/********************************************************************
filename: Bulider.h
created: 2012-09-26
author: firehood
purpose: firehood 学设计模式之---建造者模式
*********************************************************************/
#include "assert.h"
#include <iostream>
using namespace std;
#pragma once
// 抽象建造者,建造的对象由PartA和PartB两部分组成
class Builder
{
public:
Builder(void){}
~Builder(void){}
virtual void BuildPartA(void) = 0;
virtual void BuildPartB(void) = 0;
};
// 具体建造者1
class ConcreteBuilder1: public Builder
{
public:
ConcreteBuilder1(void){}
virtual ~ConcreteBuilder1(void){}
virtual void BuildPartA()
{
cout<<"建造第一种类型的产品:创建PartA"<<endl;
}
virtual void BuildPartB()
{
cout<<"建造第一种类型的产品:创建PartB"<<endl;
}
};
// 具体建造者1
class ConcreteBuilder2: public Builder
{
public:
ConcreteBuilder2(void){}
virtual ~ConcreteBuilder2(void){}
virtual void BuildPartA()
{
cout<<"建造第二种类型的产品:创建PartA"<<endl;
}
virtual void BuildPartB()
{
cout<<"建造第二种类型的产品:创建PartB"<<endl;
}
};
// 监管者,处理产品整个建造过程
class Director
{
public:
Director(Builder* pBuilder):m_pBuilder(NULL)
{
assert(pBuilder);
m_pBuilder = pBuilder;
}
virtual ~Director(void){}
void Construct(void)
{
if(m_pBuilder != NULL)
{
cout<<"建造产品中.."<<endl;
m_pBuilder->BuildPartA();
m_pBuilder->BuildPartB();
}
}
private:
Builder *m_pBuilder;
};
#include "Builder.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
cout<<"*************************************"<<endl;
cout<<"firehood 学设计模式之---建造者模式"<<endl;
cout<<"*************************************"<<endl;
Director *director;
director = new Director(new ConcreteBuilder1());
director->Construct();
delete director;
director = new Director(new ConcreteBuilder2());
director->Construct();
delete director;
system("pause");
return 0;
}
执行结果:
*************************************
firehood 学设计模式之---建造者模式
*************************************
建造产品中..
建造第一种类型的产品:创建PartA
建造第一种类型的产品:创建PartB
建造产品中..
建造第二种类型的产品:创建PartA
建造第二种类型的产品:创建PartB
请按任意键继续. . .