建造者模式Builder:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
应用场景:分步骤构建一个复杂的对象,这个步骤是稳定的算法,复杂对象的各个部分可以有不同变化
这时候,创建复杂对象的算法就和对象的组成部分、装配方式独立了。
结构图如下:
例子程序:这几天天天疯狂玩dota,dota初始化的时候要选择一个地图和一个英雄,就以这个为例子构建dota初始化游戏程序
//建造者模式:把一个复杂对象的构建和表示分离,使得同样的构建过程可以有不同的表示
#include <iostream>
#include <memory>
using namespace std;
//产品类Product:由多个部件组成
class Dota {
public:
void setMap(string m) { map = m; }
void setHero(string h) { hero = h; }
void show()
{
cout << "Create dota" << endl
<< "map : " << map << endl
<< "hero : " << hero << endl;
}
private:
string map;
string hero;
};
//抽象建造者类:确定产品的建造过程
class DotaBuilder {
public:
virtual void buildMap() = 0;
virtual void buildHero() = 0;
virtual shared_ptr<Dota> getDota() = 0;
};
//具体建造者:继承自抽象建造者
class ForestStoneDotaBuilder : public DotaBuilder {
public:
ForestStoneDotaBuilder()
: dota(new Dota())
{}
void buildMap()
{
cout << "create the map : forest" << endl;
dota->setMap("forest");
}
void buildHero()
{
cout << "create the hero : stone" << endl;
dota->setHero("stone");
}
shared_ptr<Dota> getDota()
{
return this->dota;
}
private:
shared_ptr<Dota> dota;
};
//指挥者Director:用来指挥建造过程
class DotaBuilderDirector {
public:
void construct(shared_ptr<DotaBuilder> pDotaBuilder)
{
pDotaBuilder->buildMap();
pDotaBuilder->buildHero();
}
};
int main()
{
shared_ptr<DotaBuilder> dotaBuilder(new ForestStoneDotaBuilder());
DotaBuilderDirector director;
director.construct(dotaBuilder);
shared_ptr<Dota> dota = dotaBuilder->getDota();
dota->show();
return 0;
}
/*
create the map : forest
create the hero : stone
Create dota
map : forest
hero : stone
*/