设计模式之建造者模式(C++)

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之建造者模式(C++)相关的知识,希望对你有一定的参考价值。

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、建造者模式是什么?

       建造者模式是一种创建型的软件设计模式,用于构造相对复杂的对象。

       建造者模式可以将复杂对象的构建与它的表示分离,使得相同的构建过程可以得到不同的表示。如果说工厂模式和抽象工厂模式更注重产品整体,那建造者模式则更在乎产品的组成和细节。

       建造者模式的优点:

  1. 封装性好。有效地封装了建造过程(主要业务逻辑),使得系统整体的稳定性得到了一定保证。
  2. 解耦。产品本身和建造过程解耦,相同的建造过程可以创建出不同的产品。
  3. 产品建造过程精细化。该模式注重产品创建的整个过程,将复杂的步骤拆解得到多个相对简单的步骤,使得系统流程更清晰,且对细节的把控更精准。
  4. 易于扩展。如果有新产品需求,只需要添加一个建造者类即可,不需要改动之前的代码,符合开闭原则。

      建造者模式的缺点:

  1. 产品的组成部分和构建过程要一致,限制了产品的多样性。
  2. 若产品内部有结构上的变化,则整个系统都要进行大改,增加了后期维护成本。

二、建造者模式

2.1 结构图

       客户端即Main主函数,创建监督者,由监督者带领不同的建造者完成电脑产品的不同表示。

 

2.2 代码示例

       场景描述:我联系了一家外包公司,由他们的项目经理招人为我组建一批电脑,他先招了联想的团队,项目结束后;我想再弄一批对比下(甲方财大气粗),于是他们又招了惠普的团队,再次完成项目,非常不错。

//Product.h
/****************************************************/
#pragma once
#include <iostream>

using namespace std;

// 电脑产品类
class Computer

public:
	// 获取电脑信息
	void getComputer() 
		cout << "电脑产品配置为:" << endl;
		cout << " 处理器:" << getCPU() << endl;
		cout << " 显  卡:" << getGPU() << endl;
		cout << " 主  板:" << getMainBoard() << endl;
		cout << " 内存条:" << getRAM() << endl;
	
	// 设置处理器
	void setCPU(string cpu)
		CPU = cpu;
	
	// 设置显卡
	void setGPU(string gpu) 
		GPU = gpu;
	
	// 设置主板
	void setMainBoard(string mb) 
		mainboard = mb;
	
	// 设置内存条
	void setRAM(string ram) 
		RAM = ram;
	
	// 获取处理器
	string getCPU() 
		return CPU;
	
	// 获取显卡
	string getGPU() 
		return GPU;
	
	// 获取主板
	string getMainBoard() 
		return mainboard;
	
	// 获取内存条
	string getRAM() 
		return RAM;
	

private:
	string CPU;                             // 处理器
	string GPU;                             // 显卡
	string mainboard;                       // 主板
	string RAM;                             // 内存条
;
//Builder.h
/****************************************************/
#pragma once
#include <iostream>
#include "Product.h"

using namespace std;

// 抽象建造者
class Builder

public:
	// 装配CPU
	virtual void addCPU() = 0;
	// 装配GPU
	virtual void addGPU() = 0;
	// 装配主板
	virtual void addMainBoard() = 0;
	// 装配内存
	virtual void addRAM() = 0;
	// 获取电脑产品
	Computer getComputer() 
		return m_computer;
	

protected:
	Computer m_computer;                         // 电脑产品
;

// 联想-建造者
class LenovoBuilder : public Builder

public:
	// 装配CPU
	virtual void addCPU() 
		m_computer.setCPU("Intel 酷睿i7-8700K");
	
	// 装配GPU
	virtual void addGPU() 
		m_computer.setGPU("RTX 4050");
	
	// 装配主板
	virtual void addMainBoard() 
		m_computer.setMainBoard("B760");
	
	// 装配内存
	virtual void addRAM() 
		m_computer.setRAM("三星DDR4 2666mhz 16G");
	
;

// 惠普-建造者
class HPBuilder : public Builder

public:
	// 装配CPU
	virtual void addCPU() 
		m_computer.setCPU("Intel 酷睿i5-6300HQ");
	
	// 装配GPU
	virtual void addGPU() 
		m_computer.setGPU("GTX 1060");
	
	// 装配主板
	virtual void addMainBoard() 
		m_computer.setMainBoard("B660");
	
	// 装配内存
	virtual void addRAM() 
		m_computer.setRAM("金士顿DDR4 2666mhz 16G");
	
;
//Director.h
/****************************************************/
#pragma once
#include <iostream>
#include "Builder.h"

using namespace std;

// 监督者
class Director

public:
	// 构造函数
	Director(Builder* builder) 
		m_builder = builder;
	
	// 析构函数
	~Director() 
		if (m_builder != nullptr)
			delete m_builder;
	
	// 替换建造者
	void setBuilder(Builder *builder) 
		m_builder = builder;
	
	// 建造
	Computer construct() 
		m_builder->addCPU();
		m_builder->addGPU();
		m_builder->addMainBoard();
		m_builder->addRAM();
		return m_builder->getComputer();
	
private:
	Builder *m_builder;                     // 建造者
;

//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Director.h"

using namespace std;

int main()

	// 一号建造者-联想
	Builder *builder1 = new LenovoBuilder();
	cout << "联想建造者等待就业。" << endl;
	// 由监督者监督项目启动
	Director *director = new Director(builder1);
	cout << "监督者(项目经理)开始招人做项目。" << endl;
	// 联想项目完毕,获取联想电脑产品
	Computer computer1 = director->construct();
	cout << "联想项目结束。" << endl;
	computer1.getComputer();
	// 二号建造者-惠普
	Builder *builder2 = new HPBuilder();
	cout << "惠普建造者等待就业。" << endl;
	// 替换建造者
	director->setBuilder(builder2);
	cout << "监督者(项目经理)替换建造者,做新项目。" << endl;
	Computer computer2 = director->construct();
	cout << "惠普项目结束。" << endl;
	computer2.getComputer();
	return 0;

       程序结果如下。

        在上述示例中,我们可以看到,产品有相同的构建过程,但是不同的建造者却可以完成不同表示的产品,产品的结构类似,但具体内容各不相同。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对建造者模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解建造者模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

以上是关于设计模式之建造者模式(C++)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之原型模式与建造者模式详解和应用

23种设计模式之建造者模式代码实例

Java设计模式之建造者模式(Builder Pattern)

Java设计模式之建造者模式(Builder Pattern)

设计模式之建造者模式

php设计模式之建造者模式