UML类图(仅供参考)如下:
建造者模式解决的问题:
将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示,就是一个对象的初始化太麻烦,可以使这种麻烦用一个类解决掉
源码
#include <string>
#include <iostream>
// 假如我想创建下面这个类的对象
// 但是这个对象有很多成员需要在初始化的时候赋值
// 所以可以用其他方式达到创建对象且初始化,不用自己赋值
class CComputer
{
public:
std::string master;
std::string screen;
std::string keyboard;
std::string mouse;
std::string audio;
std::string ToString()
{
return "master:" + master
+ ",screen:" + screen
+ ",keyboard:" + keyboard
+ ",mouse:" + mouse
+ ",audio:" + audio;
}
};
// 下面的抽象类就是用于生成上面类对象用的
class CComputerBuilder
{
public:
virtual ~CComputerBuilder()
{
}
CComputer *GetComputer()
{
return pComputer;
}
void BuildComputer()
{
pComputer = new CComputer();
}
// 下面就是为了初始化pComputer对象而存在的,由具体的类实现
virtual void SetMaster() = 0;
virtual void SetScreen() = 0;
virtual void SetKeyboard() = 0;
virtual void SetMouse() = 0;
virtual void SetAudio() = 0;
protected:
CComputer *pComputer;
};
// 相当于一个CComputer对象模板
class CHPComputerBuilder :public CComputerBuilder
{
public:
void SetMaster()
{
pComputer->master = "惠普";
}
void SetScreen()
{
pComputer->screen = "LG";
}
void SetKeyboard()
{
pComputer->keyboard = "雷蛇";
}
void SetMouse()
{
pComputer->mouse = "雷蛇";
}
void SetAudio()
{
pComputer->audio = "爱仕达";
}
};
// 相当于一个CComputer对象模板
class CDELLComputerBuilder :public CComputerBuilder
{
public:
void SetMaster()
{
pComputer->master = "戴尔";
}
void SetScreen()
{
pComputer->screen = "AOC";
}
void SetKeyboard()
{
pComputer->keyboard = "蓝光";
}
void SetMouse()
{
pComputer->mouse = "蓝光";
}
void SetAudio()
{
pComputer->audio = "索尼";
}
};
// 用这个类来生成想要的CComputer类对象
class CDirector
{
public:
void SetComputerBuilder(CComputerBuilder *pComputerBuilder)
{
this->pComputerBuilder = pComputerBuilder;
}
CComputer *GetComputer()
{
return pComputerBuilder->GetComputer();
}
// 构建对象
void ConstructComputer()
{
pComputerBuilder->BuildComputer();
pComputerBuilder->SetMaster();
pComputerBuilder->SetScreen();
pComputerBuilder->SetKeyboard();
pComputerBuilder->SetMouse();
pComputerBuilder->SetAudio();
}
private:
CComputerBuilder *pComputerBuilder;
};
// 测试
int main()
{
CDirector *pDirector = new CDirector();
CComputer *pComputer = nullptr;
// 创建一种表示
CHPComputerBuilder *pHPComputerBuilder = new CHPComputerBuilder();
pDirector->SetComputerBuilder(pHPComputerBuilder);
// 构建目标对象
pDirector->ConstructComputer();
// 获取目标对象
pComputer = pDirector->GetComputer();
// 目标效果
std::cout << pComputer->ToString() << std::endl;
delete pHPComputerBuilder;
CDELLComputerBuilder *pDELLComputerBuilder = new CDELLComputerBuilder();
pDirector->SetComputerBuilder(pDELLComputerBuilder);
pDirector->ConstructComputer();
pComputer = pDirector->GetComputer();
std::cout << pComputer->ToString() << std::endl;
delete pDELLComputerBuilder;
delete pDirector;
}
好处
1、建造者独立,易扩展
2、便于控制细节风险