建造者模式:将一个复杂对象的构建和它的表示分离,是同样的构建过程可以创建不同的表示。使用时用户只需要指定需要建造的类型就可以得到它们,而具体的建造细节不需知道。
建造小人结构图及代码:
#include<iostream>
using namespace std;
class PersonBuilder
{
public:
PersonBuilder()
{
}
virtual void buildHead()=0;
virtual void buildBody()=0;
virtual void buildLeg()=0;
virtual void buildArm()=0;
};
class ThinPersonBuilder:public PersonBuilder
{
public:
ThinPersonBuilder()
{
}
virtual void buildHead()
{
cout<<"build thin person's head!"<<endl;
}
virtual void buildArm()
{
cout<<"build thin person's arm!!"<<endl;
}
virtual void buildBody()
{
cout<<"build thin person's body!!"<<endl;
}
virtual void buildLeg()
{
cout<<"build thin person's leg!!"<<endl;
}
};
class FatPersonBuilder:public PersonBuilder
{
public:
FatPersonBuilder()
{
}
virtual void buildHead()
{
cout<<"build fat person's head!"<<endl;
}
virtual void buildArm()
{
cout<<"build fat person's arm!!"<<endl;
}
virtual void buildBody()
{
cout<<"build fat person's body!!"<<endl;
}
virtual void buildLeg()
{
cout<<"build fat person's leg!!"<<endl;
}
};
class BuildDirector
{
public:
PersonBuilder *person;
public:
BuildDirector(PersonBuilder *p)
{
person=p;
}
void build()
{
person->buildHead();
person->buildArm();
person->buildBody();
person->buildLeg();
}
};
int main(int argc,char**argv)
{
PersonBuilder *p=new ThinPersonBuilder;
BuildDirector bp(p);
bp.build();
cout<<endl;
PersonBuilder *q=new FatPersonBuilder;
BuildDirector bq(q);
bq.build();
return 0;
}
Builder就为创建每个Product对象的各部分指定的抽象接口,相当于代码中的PersonBuilder类。ConcretBuilder相当于代码中的ThinPersonBuilder和FatPersonBuilder。
Director相当于BuildDierctor,用于根据用户的需求使用Builder接口的对象。
建造者模式主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建通常面临复杂的变化。
建造者模式的好处是:使建造代码与与表示代码分离,建造者隐藏了改产品是如何组装的,所以若需要改变产品的内部表示,只需要在定义一个具体的建造者就可以了。
建造者模式时当创建复杂对象的算法应该独立与对象的组成部分以及它们的装配方式时适用的模式。