C++设计模式——建造者模式(Builder模式)

建造者模式

概念

  • 建造者模式(Builder Pattern),将一个复杂对象的构建与它的 表示(变化) 分离,使得 同样的构建过程(稳定) 可以创建不同的表示

GOF的UML图

C++设计模式——建造者模式(Builder模式)_第1张图片

  • Builder(抽象建造者):为创建一个产品对象的步骤提供抽象接口。
  • ConcreteBuilder(具体建造者):实现 Builder 的接口,实现该产品的各个步骤的具体实现细节
  • Director(指示器):指示ConcreteBuilder完成构建产品的框架步骤(稳定)。
  • Product(产品):表示被构造的复杂对象。

那么如何理解这个建造者模式?
假设现在有一个人的类,人的属性有性别、名字、年龄。那么当我们想创建一个人并且赋予他具体的属性,那么我们一般需要分为三步
1.设置性别
2.设置名字
3.设置年龄
这三步可以理解为构造的过程框架(稳定),但是想要实现具体的属性时,比如男性或者女性,具体的实现细节是变化的

那么我们就可以通过建造者模式实现
1.创建一个抽象建造者,提供实现步骤的接口(稳定
2.派生出具体的建造者,比如女性建造者、男性建造者。通过虚函数重写,实现具体的实现细节(变化
3.创建一个指示器,实现具体的构建框架(稳定),需要将具体的建造者传入指示器,建造者就会按照指示器的构造框架创建出对应的对象。

优缺点

优点:

  • 使用建造者模式可以使客户端不必知道产品内部组成的细节。
  • 建造者独立,易于扩展
  • 便于控制细节风险,因为实现的细节是独立开的

缺点:

  • 创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
  • 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大

适用场景

核心:建造模式中,强调的是固定整体构建的算法,而灵活扩展和切换部件的具体构造和产品装配的方式

  • 生成的对象具有复杂的内部结构,且这个结构是稳定的
  • 不同配置的构建对象,产生不同结果时。
  • 相同的构建过程,不同的执行顺序,产生不同结果时。

具体实例

首先创建一个 人的类,具体性别、名字、年龄等属性

#ifndef _HUMAN_H
#define _HUMAN_H
#include 
#include 
using namespace std;

//人类
class Human
{
public:
	Human(){};
	~Human(){};

	void SetSex(string sex){ this->m_sex = sex; }
	void SetName(string name){ this->m_name = name; }
	void SetAge(string age){ this->m_age = age; }
	void ShowInfo()
	{
		cout << m_sex << endl;
		cout << m_name << endl;
		cout << m_age << endl;

	}
private:
	string m_sex;
	string m_name;
	string m_age;
};

#endif

建造者类

#ifndef _BUILDER_H
#define _BUILDER_H
#include "Human.h"
class Human;

//抽象建造者类
class HumanBuilder
{
public:
	virtual ~HumanBuilder(){};

	virtual void BuilderSetSex() = 0;
	virtual void BuilderSetName() = 0;
	virtual void BuilderSetAge() = 0;

	Human* GetHuman(){ return m_human; }

protected:
	HumanBuilder(){ this->m_human = new Human(); };

	Human* m_human;
};

//女人建造者(具体)
class WomanBuilder :public HumanBuilder
{
public:
	WomanBuilder(){};
	 ~WomanBuilder(){};

	 void BuilderSetSex(){ this->m_human->SetSex("女性"); }
	 void BuilderSetName(){ this->m_human->SetName("翠翠"); }
	 void BuilderSetAge(){ this->m_human->SetAge("18"); }
};

//男人建造者(具体)
class ManBuilder :public HumanBuilder
{
public:
	ManBuilder(){};
	~ManBuilder(){};

	void BuilderSetSex(){ this->m_human->SetSex("男性"); }
	void BuilderSetName(){ this->m_human->SetName("张三"); }
	void BuilderSetAge(){ this->m_human->SetAge("20"); }
};

//指示器
class HumanDirector
{
public:	
	//创建框架(稳定)
	Human* CreateHuman(HumanBuilder* humanBuilder)
	{
		//步骤1(具体创建步骤内容是变化的,可以通过具体建造者重写)
		humanBuilder->BuilderSetSex();
		//步骤2
		humanBuilder->BuilderSetName();
		//步骤3;
		humanBuilder->BuilderSetAge();

		return humanBuilder->GetHuman();
	}
};


#endif

主函数

#include 
#include "Human.h"
#include "builder.h"

using namespace std;

int main()
{
	//创建指示器
	HumanDirector* humanDirector = new HumanDirector();

	//创建建造者
	WomanBuilder* womanBuilder = new WomanBuilder();
	ManBuilder* manBuilder = new ManBuilder();

	//将建造者放入指示器,通过指示器稳定的创建框架完成对human的属性设置
	Human* woman = humanDirector->CreateHuman(womanBuilder);
	Human* man = humanDirector->CreateHuman(manBuilder);

	//显示信息
	woman->ShowInfo();
	man->ShowInfo();

	while (1);
	return 0;
}

运行结果
C++设计模式——建造者模式(Builder模式)_第2张图片

你可能感兴趣的:(C/C++)