建造者模式属于对象创建型模式,也可叫做是生成器模式,建造者模式的结构如下图:
如图可以看出,建造者模式主要有生成器(Director),抽象建造者(Builder),具体建造者(ConcreteBuilderA,ConcreteBuilderB),产品类(ProductA,ProductB)组成。各个参与者主要的作用:
生成器:构造一个使用Builder接口的对象
抽象建造者:为创建一个Product对象的各个部件抽象接口
具体建造者:1 实现Builder的接口装配产品的各个组件
2 定义并明确他创建的表示
3 提供一个检索产品的接口(getResult)
产品类:1 表示被构建的复杂对象,具体建造者创建该产品的内部表示和定义它的装配过程
2 包含定义组成部件的类,包括将这些组件装配成最终产品的接口
建造者模式的流程:1 客户创建Director对象,并使用适当的Builder进行配置
2 一旦产品部件被生产,导向器会通知生成器
3 生成器处理导向器的请求,并将该部件加入到产品中
4 客户通过检索的接口,检索生成的最终产品
一句话概述就是:建造者模式,将一个复杂对象的构造与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用建造者模式的优势在与:
1 用户只需要指定需要构建的类型就可以使用,而不需要具体构建构成的细节
2 他可以使你改变的产品的内部表示,当你需要更改产品的内部表示时,只需添加一个建造者就可以了
3 构建代码和表示代码解耦,可以轻松复用构建者的代码
4 让你对构建过程的代码可以进行精细的控制,从而可以更精细的控制产品的内部结构
不过要注意的是实现Builder类的时候,接口必须要足够的普遍,一边满足不同具体产品的构建
一下以更具体的例子来说明(小人不才,就使用了大话设计模式里面的例子)
//客户调用的方法
Director* director = new Director();
//构建瘦子
PersonBuilder* tbuilder = new ThinBuilder();
director->createPerson(tbuilder);
Person* tpersion = tbuilder->getPerson();
tpersion->showPerson();
//构建胖子
PersonBuilder* fbuilder = new FatBuilder();
director->createPerson(fbuilder);
Person* fpersion = fbuilder->getPerson();
fpersion->showPerson();
//接下来是导向器的实现
#include "Director.h"
Director::Director()
{
}
Director::~Director()
{
}
//具体的构建过程
void Director::createPerson(PersonBuilder* builder)
{
builder->buildArmLeft();
builder->buildArmRight();
builder->buildHead();
builder->buildLegLeft();
builder->buildLegRight();
}
接下来是抽象构建者
/************************************************************************
@fileName: PersonBuilder.h
@function: 建造者模式中抽象建造类
@author: jaime
@ver: 1.0.0
************************************************************************/
#pragma once
#include "Person.h"
class PersonBuilder
{
public:
PersonBuilder();
~PersonBuilder();
virtual void buildHead();
virtual void bulldBody();
virtual void buildArmLeft();
virtual void buildArmRight();
virtual void buildLegLeft();
virtual void buildLegRight();
virtual Person* getPerson();
private:
};
//瘦子的构建类
#include "ThinBuilder.h"
ThinBuilder::ThinBuilder()
:m_person(new Person())
{
}
ThinBuilder::~ThinBuilder()
{
delete m_person;
}
void ThinBuilder::buildArmLeft()
{
m_person->addPart("瘦子的左手");
}
void ThinBuilder::buildArmRight()
{
m_person->addPart("瘦子的右手");
}
void ThinBuilder::buildHead()
{
m_person->addPart("瘦子的头");
}
void ThinBuilder::buildLegLeft()
{
m_person->addPart("瘦子的左手");
}
void ThinBuilder::buildLegRight()
{
m_person->addPart("瘦子的右脚");
}
Person* ThinBuilder::getPerson()
{
return m_person;
}
//胖子的构建类
#include "FatBuilder.h"
FatBuilder::FatBuilder()
:m_persion(new Person())
{
}
FatBuilder::~FatBuilder()
{
delete m_persion;
}
void FatBuilder::buildArmLeft()
{
m_persion->addPart("胖子的左手");
}
void FatBuilder::buildArmRight()
{
m_persion->addPart("胖子的右手");
}
void FatBuilder::buildHead()
{
m_persion->addPart("胖子的头");
}
void FatBuilder::buildLegLeft()
{
m_persion->addPart("胖子的左脚");
}
void FatBuilder::buildLegRight()
{
m_persion->addPart("胖子的右脚");
}
Person* FatBuilder::getPerson()
{
return m_persion;
}
//产品的实现
#include "Person.h"
Person::Person()
{
}
Person::~Person()
{
}
void Person::addPart(string part)
{
this->m_partVec.push_back(part);
}
void Person::showPerson()
{
vector<string>::iterator it = this->m_partVec.begin();
while ( it != this->m_partVec.end() )
{
cout << "" << *it << endl;
it++;
}
}