建造者模式定义:
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式包括的角色:
(1)Builder:给出一个抽象接口或抽象类,以规范产品的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建,一般由子类具体实现。
(2)ConcreteBuilder:Builder接口的实现类,并返回组建好对象实例。
(3)Director:调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
(4)Product:要创建的复杂对象,产品类。
建造者模式的使用场景:
(1)当产品有复杂的内部构造时(参数很多)。
(2)需要生产的产品的属性相互依赖,这些属性的赋值顺序比较重要时(因为在调用ConcreteBuilder的赋值方法时是有先后顺序的)。
#include <iostream>
#include <vector>#include <string>
using namespace std;
// 房子
class Home
{
public:
void buildPart(string name)
{
parts.push_back(name);
}
void show()
{
for (unsigned int i = 0; i < parts.size(); i++)
cout << parts[i] << endl;
}
private:
vector<string> parts;
};
// 抽象建造者 : 工程队
class Builder
{
public:
Builder()
{
home = new Home;
}
Home* getHome()
{
return home;
}
public:
virtual void BuildBase() = 0; // 打地基
virtual void BuildWall() = 0; // 砌墙
virtual void Buildwindow() = 0; // 安窗户
virtual void BuildDoor() = 0; // 装门
protected:
Home *home;
};
// 建造茅草房的工程队
class WoodBuilder:public Builder
{
public:
virtual void BuildBase()
{
home->buildPart("茅草房的地基");
}
virtual void BuildWall()
{
home->buildPart("茅草房的墙");
}
virtual void Buildwindow()
{
home->buildPart("茅草房的窗户");
}
virtual void BuildDoor()
{
home->buildPart("茅草房的门");
}
};
// 建造别墅的工程队
class VillaBuilder:public Builder
{
public:
virtual void BuildBase()
{
home->buildPart("别墅的地基");
}
virtual void BuildWall()
{
home->buildPart("别墅的墙");
}
virtual void Buildwindow()
{
home->buildPart("别墅的窗户");
}
virtual void BuildDoor()
{
home->buildPart("别墅的门");
}
};
// 指挥者, 指挥工程队造房子 ======> 各个部件的组装过程
class Director
{
public:
Director(Builder *b)
{
buider = b;
}
// 建造过程, 组装过程
void Concrete()
{
buider->BuildBase();
buider->BuildWall();
buider->Buildwindow();
buider->BuildDoor();
}
private:
Builder *buider;
};
int main()
{
// Builder *pb = new VillaBuilder; // 工程队
Builder *pb = new WoodBuilder; // 工程队
Director *pd = new Director(pb); // 指挥者
pd->Concrete(); // 造房子的过程
// 拿房
Home *ph = pb->getHome();
ph->show();
return 0;
}
总体而言 建造者模式 跟工厂模式相比, 多了一个控制类, 用来控制对象的创建. 同时建造者模式 是关注的创建的过程.为了减少中间创建对象代码
建造者模式优缺点
建造者模式的优点:
(1)建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心,良好的封装性是建造者模式的优点之一。
(2)建造者类逻辑独立,易拓展。
建造者模式的缺点:
很明显产生了多余的Build对象以及Dirextor对象,消耗了内存。