C++设计模式

C++设计模式,第1张

1、建造者模式定义

好的,各位观众老爷们。


今天我们来学习一下建造者模式的这个设计方法。


首先我们看下它的定义是啥?定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。


它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。


它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。


这句话,我看了,属实不太懂。


但是我觉得可以用一个方式很好的理解。


那就是搞一个框架,里面的各个部分呢,都是可以变化的,但是框架不变,将不同的东西都塞在框架对应的位置就成了不同的产品,就可以了。


反正我是这样理解的,并且也可以根据不同的参数选择不通的配置,这样理解起来就方便很多了。


1.1 模式优点
封装性好,构建和表示分离。


各个模块独立,方便管理。


扩展性好,各个具体的建造者相互独立,有利于系统的解耦。


客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其它模块产生任何影响,便于控制细节风险。


1.2 模式缺点
产品的组成部分必须相同,这限制了其使用范围。


如果产品的内部变化复杂,如果产品内部发生变化,则建造者也要同步修改,后期维护成本较大。


1.3 主要角色
产品角色(Product):它是包含多个组成部件的复杂对象,由具体建造者来创建其各个零部件。


抽象建造者(Builder):它是一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。


具体建造者(Concrete Builder):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。


指挥者(Director):它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。


2、实例 2.1 无参数的实例
/*************************************************************************
	> File   : buidler_mode.cpp
	> Author : 小和尚念经敲木鱼
	> Email  : null
	> Time   : Mon 26 Jul 2021 08:59:49 PM CST
*************************************************************************/
#include

/************************************************************************
 * 文件说明
 * 构造者模式示例
*************************************************************************/
class Builder
{
public:
	virtual void Build_A() {};
	virtual void Build_B() {};
	virtual void Build_C() {};
	virtual void Build_D() {};
	virtual void Build_E() {};
};

class TestBuilder_A : public Builder
{
public:
	std::string mName = "TestBuilder_A ";
public:
	void Build_A() {std::cout <<mName << __func__ << std::endl;}
	void Build_B() {std::cout <<mName << __func__ << std::endl;}
	void Build_C() {std::cout <<mName << __func__ << std::endl;}
  void Build_E() {std::cout <<mName << __func__ << std::endl;}
};
class TestBuilder_B : public Builder
{
public:
	std::string mName = "TestBuilder_B ";
public:
	void Build_A() {std::cout <<mName << __func__ << std::endl;}
	void Build_B() {std::cout <<mName << __func__ << std::endl;}
	void Build_C() {std::cout <<mName << __func__ << std::endl;}
	void Build_D() {std::cout <<mName << __func__ << std::endl;}
	void Build_E() {std::cout <<mName << __func__ << std::endl;}
};

class Director
{
private:
	Builder * mBuilder = NULL;
public:
	Director(Builder * builder) {mBuilder = builder;};
	void CreateBuilder()
	{
		mBuilder->Build_A();
		mBuilder->Build_B();
		mBuilder->Build_C();
		mBuilder->Build_D();
		mBuilder->Build_E();
	}
};

//

int main(int argc,char * argv[])
{
	TestBuilder_A * test_build_a = new TestBuilder_A();
	Director director(test_build_a);
	director.CreateBuilder();

	TestBuilder_B * test_build_b = new TestBuilder_B();
	Director director2(test_build_b);
	director2.CreateBuilder();

	return 0;
}

/
//out
//TestBuilder_A Build_A
//TestBuilder_A Build_B
//TestBuilder_A Build_C
//TestBuilder_A Build_E
//TestBuilder_B Build_A
//TestBuilder_B Build_B
//TestBuilder_B Build_C
//TestBuilder_B Build_D
//TestBuilder_B Build_E
2.2 有参数的实例
/*************************************************************************
	> File   : builder2_mode.cpp
	> Author : 小和尚念经敲木鱼
	> Email  : null
	> Time   : Thu 26 Aug 2021 11:24:25 AM CST
*************************************************************************/

#include
using namespace std;

/************************************************************************
 * 文件说明
 * 构造者模式示例
*************************************************************************/

class  Computer
{
public:
	std::string mCpu; //必须
	std::string mRam; //必须
	std::string mKeyBoard;//可选
	std::string mDisplay;//可选
	int mUsbCount;//可选
public:
	class Builder
	{
		public:
			std::string mCpu; //必须
			std::string mRam; //必须
			std::string mKeyBoard;//可选
			std::string mDisplay;//可选
			int mUsbCount;//可选
		public:
			Builder(std::string cpu,std::string ram)
			{
				this->mCpu = cpu;
				this->mRam = ram;
			}
			Builder setCpu(std::string &cpu)
			{
				this->mCpu = cpu;
				return *this;
			}
			Builder setRam(std::string ram)
			{
				this->mRam = ram;
				return *this;
			}
			Builder setKeyBoard(std::string keyboard)
			{
				this->mKeyBoard = keyboard;
				return *this;
			}
			Builder setDisplay(std::string display)
			{
				this->mDisplay = display;
				return *this;
			}
			Builder setUsbCount(int usbcount) 
			{
				this->mUsbCount = usbcount;
				return *this;
			}
			Computer * build()
			{
				return new Computer(this); 
			}
	};
	Computer(Builder * builder)
	{
		this->mCpu = builder->mCpu;
		this->mRam = builder->mRam;
		this->mKeyBoard = builder->mKeyBoard;
		this->mDisplay = builder->mDisplay;
		this->mUsbCount = builder->mUsbCount;
	}
	Computer(Computer * computer)
	{
		this->mCpu = computer->mCpu;
		this->mRam = computer->mRam;
		this->mKeyBoard = computer->mKeyBoard;
		this->mDisplay = computer->mDisplay;
		this->mUsbCount = computer->mUsbCount;
	}
public:
	void display()
	{
		std::cout << "###################" <<std::endl;
		std::cout << "mCpu = " << mCpu <<std::endl;
		std::cout << "mRam = " << mRam <<std::endl;
		std::cout << "mKeyBoard = " << mKeyBoard << std::endl;
		std::cout << "mDisplay = " << mDisplay  << std::endl;
		std::cout << "mUsbCount = " << mUsbCount << std::endl;
		std::cout << "###################" <<std::endl;
	}
};
int main(int argc,char * argv[])
{
	Computer * computer = new Computer(Computer::Builder("I3","Inter")
                                      .setDisplay("32寸")
                                      .setKeyBoard("双飞燕")
                                      .setUsbCount(2).build());
	computer->display();
	Computer * computer_1 = new Computer(Computer::Builder("None","ARM")
                                      .setKeyBoard("Rk")
                                      .setUsbCount(1).build());
	computer_1->display();
 	return 0;
}
//OUT
//###################
//###################
//mCpu = I3
//mRam = Inter
//mKeyBoard = 双飞燕
//mDisplay = 32寸
//mUsbCount = 2
//###################
//###################
//mCpu = None
//mRam = ARM
//mKeyBoard = Rk
//mDisplay = 
//mUsbCount = 1
//###################

3、使用总结

一般来说,建造者模式应用于复杂对象的构建过程。


并且也应用于一些公共部分的功能,但是大家具体的是实现不一样的。


此模式可以灵活的选择多个参数,并且很多参数都可以默认有一个初始值,这样也为了保证能够构造出完整的对象。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存