1、概念:
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
对象的创建:Builder模式是为对象的创建而设计的模式- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象- 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法
class A
{
private:
B *b;
}
2、模式中包含的角色及其职责
3、使用环境:
一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。
4、建造者模式和工厂模式的区别:
Factory模式中:
1、有一个抽象的工厂。
2、实现一个具体的工厂---汽车工厂。
3、工厂生产汽车A,得到汽车产品A。
4、工厂生产汽车B,得到汽车产品B。
这样做,实现了购买者和生产线的隔离。强调的是结果。
Builder模式:
1、引擎工厂生产引擎产品,得到汽车部件A。
2、轮胎工厂生产轮子产品,得到汽车部件B。
3、底盘工厂生产车身产品,得到汽车部件C。
4、将这些部件放到一起,形成刚好能够组装成一辆汽车的整体。
5、将这个整体送到汽车组装工厂,得到一个汽车产品。
这样做,目的是为了实现复杂对象生产线和其部件的解耦。强调的是过程
两者的区别在于:
Factory模式不考虑对象的组装过程,而直接生成一个我想要的对象。
Builder模式先一个个的创建对象的每一个部件,再统一组装成一个对象。
Factory模式所解决的问题是,工厂生产产品。
而Builder模式所解决的问题是工厂控制产品生成器组装各个部件的过程,然后从产品生成器中得到产品。
5、建造者模式的实现:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
class House
{
public:
void buildBase(string base) // 打地基
{
_parts.push_back(base);
}
void buildWall(string wall) // 砌墙
{
_parts.push_back(wall);
}
void buildWindows(string windows) // 安窗户
{
_parts.push_back(windows);
}
void buildDoor(string d) // 装门
{
_parts.push_back(d);
}
void show()
{
for (unsigned int i = 0; i < _parts.size(); i++)
cout << _parts[i] << endl;
}
private:
vector<string> _parts;
};
// 抽象的建造者
class AbsBuilder
{
public:
virtual void buildBase() = 0;
virtual void buildWall() = 0;
virtual void buildWindows() = 0;
virtual void buildDoor() = 0;
virtual House *getHouse() = 0;
};
// 盖茅草房的建造者
class WoodBuilder : public AbsBuilder
{
public:
WoodBuilder()
{
ph = new House;
}
virtual void buildBase()
{
ph->buildBase("茅草房的地基");
}
virtual void buildWall()
{
ph->buildBase("茅草房的墙");
}
virtual void buildWindows()
{
ph->buildBase("茅草房的窗户");
}
virtual void buildDoor()
{
ph->buildBase("茅草房的门");
}
House *getHouse()
{
return ph;
}
private:
House *ph;
};
// 别墅
class VillaBuilder : public AbsBuilder
{
public:
VillaBuilder()
{
ph = new House;
}
virtual void buildBase()
{
ph->buildBase("别墅的地基");
}
virtual void buildWall()
{
ph->buildBase("别墅的墙");
}
virtual void buildWindows()
{
ph->buildBase("别墅的窗户");
}
virtual void buildDoor()
{
ph->buildBase("别墅的门");
}
House *getHouse()
{
return ph;
}
private:
House *ph;
};
// 指挥者
class Director
{
public:
Director(AbsBuilder *builder)
{
this->builder = builder;
}
// 换建造者
void setBuilder(AbsBuilder *builder)
{
this->builder = builder;
}
// 建造
void Concrete()
{
builder->buildBase();
builder->buildWall();
builder->buildWindows();
builder->buildDoor();
}
private:
AbsBuilder *builder;
};
int main()
{
AbsBuilder *b1 = new WoodBuilder; // 工程队
Director *d = new Director(b1); // 包工头
d->Concrete(); // 指挥造房
House *h = b1->getHouse(); // 拿房
h->show();
cout << "---------------" << endl;
AbsBuilder *b2 = new VillaBuilder;
d->setBuilder(b2);
d->Concrete();
House *h1 = b2->getHouse();
h1->show();
return 0;
}