设计模式之建造者模式-其实,每个程序员都是一名建造者!

一、建造者模式的概念

建造者模式模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,把复合对象的
建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

二、建造者模式使用场景

1、一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。
2、对象内部各个属性之间有相互依赖的关系。

三、建造者模式构建方法

1、抽象建造者类

为创建产品各个部分提供统一抽象接口。

2、构建具体建造者类

构建具体的创建产品的各个部分。

3、指挥者类

构造一个使用抽象建造者接口的对象。

4、构建具体产品类

建造者模式所创建的具体产品实例化对象。

四、建造者模式的示例

// BuilderPattern.cpp : 此文件包含 “main” 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>

using namespace std;

class Phone
{
public:
	void setChip(string chip)
	{
		m_chipStr = chip;
	}

	void setScreen(string screen)
	{
		m_screenStr = screen;
	}

	void setShell(string shell)
	{
		m_shellStr = shell;
	}

	string getChip()
	{
		return m_chipStr;
	}

	string getScreen()
	{
		return m_screenStr;
	}

	string getShell()
	{
		return m_shellStr;
	}

private:
	string m_chipStr;
	string m_screenStr;
	string m_shellStr;
};

class Builder
{
public:
	virtual void makeChip() = 0; // 手机芯片
	virtual void makeScreen() = 0; // 手机屏幕
	virtual void makeShell() = 0; // 手机壳
	virtual Phone* getPhone() = 0; // 手机
};

class HuaWeiPhoneBuild : public Builder
{
public:
	HuaWeiPhoneBuild()
	{
		m_pPhone = new Phone;
	}

	virtual void makeChip()
	{
		m_pPhone->setChip("HuaWei Chip");
	}

	virtual void makeScreen()
	{
		m_pPhone->setScreen("HuaWei Screen");
	}

	virtual void makeShell()
	{
		m_pPhone->setShell("HuaWei Shell");
	}

	virtual Phone *getPhone()
	{
		return m_pPhone;
	}

private:
	Phone *m_pPhone;
};

class XiaoMiPhoneBuild : public Builder
{
public:
	XiaoMiPhoneBuild()
	{
		m_pPhone = new Phone;
	}

	virtual void makeChip()
	{
		m_pPhone->setChip("XiaoMi Chip");
	}

	virtual void makeScreen()
	{
		m_pPhone->setScreen("XiaoMi Screen");
	}

	virtual void makeShell()
	{
		m_pPhone->setShell("XiaoMi Shell");
	}

	virtual Phone *getPhone()
	{
		return m_pPhone;
	}

private:
	Phone *m_pPhone;
};

class Director
{
public:
	void creatPhone(Builder *pBuilder)
	{
		pBuilder->makeChip();
		pBuilder->makeScreen();
		pBuilder->makeShell();
	}
};
#define DELETE_PTR(p) {if(p!=nullptr){delete (p); (p)=nullptr;}}
int main()
{
	Director *pDirector = new Director;
	// 指挥者指挥建造产品
	HuaWeiPhoneBuild *pHuaWeiBuilder = new HuaWeiPhoneBuild;
	pDirector->creatPhone(pHuaWeiBuilder);
	Phone *pHuaWeiPhone = pHuaWeiBuilder->getPhone();

	XiaoMiPhoneBuild *pXiaoMiBuilder = new XiaoMiPhoneBuild;
	pDirector->creatPhone(pXiaoMiBuilder);
	Phone *pXiaoMiPhone = pXiaoMiBuilder->getPhone();

	// 输出测试
	cout << "------HuaWei--------" << endl;
	cout << "Chip: " << pHuaWeiPhone->getChip() << endl;
	cout << "Screen: " << pHuaWeiPhone->getScreen() << endl;
	cout << "Shell: " << pHuaWeiPhone->getShell() << endl;
	cout << "------XiaoMi--------" << endl;
	cout << "Chip: " << pXiaoMiPhone->getChip() << endl;
	cout << "Screen: " << pXiaoMiPhone->getScreen() << endl;
	cout << "Shell: " << pXiaoMiPhone->getShell() << endl;
	
    DELETE_PTR(pDirector);
	DELETE_PTR(pHuaWeiBuilder);
	DELETE_PTR(pXiaoMiBuilder);
	DELETE_PTR(pHuaWeiPhone);
	DELETE_PTR(pXiaoMiPhone);

	std::cout << "Hello World!\n";
	getchar();
}

运行结果:
在这里插入图片描述

五、建造者模式的优缺点

优点:

建造者本身独立且易于扩展
容易把控细节风险

缺点:

产品之间必须有共同点
产品太复杂的话将会有很多的建造类

能力有限,如有错误,多多指教。。。

posted @ 2020-02-13 12:00  ISmileLi  阅读(1)  评论(0编辑  收藏  举报