建造者模式:将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。
将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
优点:
- 各个具体的建造者相互独立,有利于系统的扩展。
- 客户端不必知道产品内部组成的细节,便于控制细节风险。
缺点:产品的组成部分必须相同,这限制了其使用范围。如果产品的内部变化复杂,该模式会增加很多的建造者类。
主要角色:
- 产品角色:包含多个组成部件的复杂对象,由具体建造者来创建其各个部件。
- 抽象建造者:一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
- 具体建造者:实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。
- 指挥者:调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。
第一步:产品角色
代码语言:javascript复制//产品角色
//包含多个组成部件的复杂对象
class People
{
public:
void setHead(string head)
{
this->head=head;
cout<<head<<endl;
}
void setBody(string body)
{
this->body=body;
cout<<body<<endl;
}
void setHand(string hand)
{
this->hand=hand;
cout<<hand<<endl;
}
void setFeet(string feet)
{
this->feet=feet;
cout<<feet<<endl;
}
void show()
{
cout<<"人人构造完成"<<endl;
}
private:
string head;
string body;
string hand;
string feet;
};
第二步:抽象建造者
代码语言:javascript复制//抽象建造者
//包含创建产品各个子部件的抽象方法
class BuildPeople
{
//创建产品对象
protected:
People *people=new People();
public:
virtual void buildHead()=0;
virtual void buildBody()=0;
virtual void buildHand()=0;
virtual void buildFeet()=0;
//返回产品对象
People *getPeople()
{
return people;
}
};
第三步:具体创造者
代码语言:javascript复制//具体创造者
//实现抽象建造者接口
class ConcreteBuildPeople:public BuildPeople
{
public:
void buildHead()
{
people->setHead("建造 人的头头");
}
void buildBody()
{
people->setBody("建造 人的身体");
}
void buildHand()
{
people->setHand("建造 人的手手");
}
void buildFeet()
{
people->setFeet("建造 人的脚脚");
}
};
第四步:指挥者
代码语言:javascript复制//指挥者
//调用建造者中的方法完成复杂对象的创建
class DirectorPeople
{
private:
//抽象类实例化子类
BuildPeople *builderpeople=new ConcreteBuildPeople();
public:
DirectorPeople(BuildPeople *builderpeople)//抽象类实例化
{
this->builderpeople=builderpeople;
}
//产品构建与组装方法
People *construct()
{
builderpeople->buildHead();
builderpeople->buildBody();
builderpeople->buildHand();
builderpeople->buildFeet();
return builderpeople->getPeople();
}
};
第五步:实现
代码语言:javascript复制#include "p.h"
int main()
{
BuildPeople *builder=new ConcreteBuildPeople();
DirectorPeople *director=new DirectorPeople(builder);
People *people=director->construct();
people->show();
return 0;
}
结果显示: