设计模式之 创建者(Builder)模式(C++实现)

这篇文章介绍设计模式中 "创建型模式"的第三种 —— 创建者(Builder)模式。


创建者模式将复杂对象的构造和表示相分离,同样的构建过程可以创建不同的表示。

其强调创建产品的过程是有步骤的,有时候甚至可以强制指定构建次序。

其中产品的不同表现形式是通过扩展 构造器 实现的。


下面以汽车产品为例进行说明,比如汽车包括:汽车厂商 汽车引擎 汽车底盘 汽车轮胎。


一个汽车厂商生产的汽车,各部件可以采用不同公司生产的,只需对其进行组合即可。

因此定义一个抽象创建者类,该类提供了上述各个部件的实现接口。


对于不同的factory,生成一个相应的创建者Builder(继承自抽象创建者类),实现抽象类中的相应方法即可。


代码如下:

#include <iostream>
#include <string>
#include <memory>

using namespace std;

// 产品(包括多个部件)
class CCar
{
public:
	void setManufactory(const string& manufactory)
	{
		m_strManufactory = manufactory;
	}
	const string& getManufactory()
	{
		return m_strManufactory;
	}

	// 部件1
	void setEngine(const string& engine)
	{
		m_strEngine = engine;
	}
	const string& getEngine()
	{
		return m_strEngine;
	}

	// 部件2
	void setUnderPan(const string& underPan)
	{
		m_strUnderPan = underPan;
	}
	const string& getUnderPan()
	{
		return m_strUnderPan;
	}

	// 部件3
	void setWheel(const string& wheel)
	{
		m_strWheel = wheel;
	}
	const string& getWheel()
	{
		return m_strWheel;
	}

	void printInfo()
	{
		cout << m_strManufactory << " " << m_strEngine <<
			" " << m_strUnderPan << " " << m_strWheel << endl;
	}

private:
	string m_strManufactory;
	string m_strEngine;
	string m_strUnderPan;
	string m_strWheel;
};

// Abstract Builder
class CCarBuildBase
{
public:
	// 不变的部分作为公开接口函数 这里的接口需要稳定
	CCar* build()
	{
		buildManufactory();
		buildEngine();
		buildUnderPan();
		buildWheel();

		return &m_car;
	}

protected:
	// 可变的部分由子类实现
	// 复杂Car对象由以下几个模块组成
	virtual void buildManufactory() = 0;
	virtual void buildEngine() = 0;
	virtual void buildUnderPan() = 0;
	virtual void buildWheel() = 0;
	CCar m_car;
};

// 第一个concrete builder
class GMCarBuilder :public CCarBuildBase
{
protected:
	void buildManufactory()
	{
		m_car.setManufactory("GM");
	}

	void buildEngine()
	{
		m_car.setEngine("劳斯莱斯引擎");
	}

	void buildUnderPan()
	{
		m_car.setUnderPan("GM底盘");
	}

	void buildWheel()
	{
		m_car.setWheel("Miklon轮胎");
	}
};

// 第二个concrete builder
class FordCarBuilder :public CCarBuildBase
{
protected:
	void buildManufactory()
	{
		m_car.setManufactory("Ford");
	}

	void buildEngine()
	{
		m_car.setEngine("劳斯莱斯引擎");
	}

	void buildUnderPan()
	{
		m_car.setUnderPan("Benz底盘");
	}

	void buildWheel()
	{
		m_car.setWheel("PulySitong轮胎");
	}
};

// 创建产品(CCar)的指导类
class CCarDirector
{
public:
	CCar* buildCar(CCarBuildBase* pBuilder)
	{
		return pBuilder->build();
	}
};

// 测试函数
void testBuilder()
{
	CCarDirector director;
	GMCarBuilder gmBuilder;
	FordCarBuilder fordBuilder;

	CCar* pCar = director.buildCar(&gmBuilder);
	pCar->printInfo();

	pCar = director.buildCar(&fordBuilder);
	pCar->printInfo();

	delete pCar;
	pCar = NULL;
}

int main(void)
{
	testBuilder();

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值