C++建造者模式(Builder)

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、便于控制细节风险

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值