Tsai笔记:C++设计模式学习(7)—— 构建器(Builder)

Tsai笔记:C++设计模式学习(7)—— 构建器(Builder)

设计模式的系列笔记链接如下:

Tsai笔记:C++设计模式学习(1)—— 设计模式介绍及分类

Tsai笔记:C++设计模式学习(2)—— 单例模式(Singleton)

Tsai笔记:C++设计模式学习(3)—— 享元模式(Flyweight)

Tsai笔记:C++设计模式学习(4)—— 工厂模式方法(Factory Method)

Tsai笔记:C++设计模式学习(5)—— 抽象工厂模式(Abstract Factory)

Tsai笔记:C++设计模式学习(6)—— 原型模式(ProtoType)

Tsai笔记:C++设计模式学习(7)—— 构建器(Builder)

一、模式定义

构建器:将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。                                                                                                                                                                                   ——《设计模式》Gof

二、要点总结

  • Builder模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化。
  • 变化点在哪里,封装哪里—— Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动。其缺点在于难以应对“分步骤构建算法”的需求变动。
  • 在Builder模式中,要注意不同语言中构造器内调用虚函数的差别(C++ vs. C#) 。

三、C++ 代码呈现

1、版本一

构建器主要函数:Builder_1.h

#include <iostream>

class House {
public:
	//建房具体步骤
	void Init() {
		this->BuildPart1();

		for (int i = 0; i < 4; i++) {
			this->BuildPart2();
		}

		bool flag = this->BuildPart3();

		if (flag) {
			this->BuildPart4();
		}

		this->BuildPart5();
	}

//设置为protected 不给类外使用
protected:
	virtual void BuildPart1() = 0;
	virtual void BuildPart2() = 0;
	virtual bool BuildPart3() = 0;
	virtual void BuildPart4() = 0;
	virtual void BuildPart5() = 0;
};


class StoneHouse : public House {
	static int CountPart2;
protected:
	virtual void BuildPart1() {
		std::cout << " --- BuildPart1 Done ! " << std::endl;
	}
	virtual void BuildPart2() {
		std::cout << " --- BuildPart2 NUM = " << ++CountPart2 << std::endl;
	}
	virtual bool BuildPart3() {
		// ... BuildPart3成功
		std::cout << " --- BuildPart3 Done ! " << std::endl;
		return true;
	}
	virtual void BuildPart4() {
		std::cout << " --- BuildPart4 Done ! " << std::endl;
	}
	virtual void BuildPart5() {
		std::cout << " --- BuildPart5 Done ! " << std::endl;
		std::cout << " === Finish All Build House Done ! " << std::endl;
	}
};

int StoneHouse::CountPart2 = 0;

测试函数:main.cpp

#include <Builder_1.h>

int main() {
	House* pHouse = new StoneHouse();
	pHouse->Init();
	return 0;
}

 输出结果为:

 --- BuildPart1 Done !
 --- BuildPart2 NUM = 1
 --- BuildPart2 NUM = 2
 --- BuildPart2 NUM = 3
 --- BuildPart2 NUM = 4
 --- BuildPart3 Done !
 --- BuildPart4 Done !
 --- BuildPart5 Done !
 === Finish All Build House Done !

2、版本二

构建器主要函数:Builder_2.h

#include <iostream>

class House {
	//....
};

class HouseBuilder {
public:
	House* GetResult() {
		return pHouse;
	}
	virtual ~HouseBuilder() {}
protected:
	House* pHouse;
	virtual void BuildPart1() = 0;
	virtual void BuildPart2() = 0;
	virtual bool BuildPart3() = 0;
	virtual void BuildPart4() = 0;
	virtual void BuildPart5() = 0;

};

class StoneHouse : public House {

};

class StoneHouseBuilder : public HouseBuilder {
	static int CountPart2;
protected:
	virtual void BuildPart1() {
		std::cout << " --- StoneHouse BuildPart1 Done ! " << std::endl;
	}
	virtual void BuildPart2() {
		std::cout << " --- StoneHouse BuildPart2 NUM = " << ++CountPart2 << std::endl;
	}
	virtual bool BuildPart3() {
		// ... BuildPart3成功
		std::cout << " --- StoneHouse BuildPart3 Done ! " << std::endl;
		return true;
	}
	virtual void BuildPart4() {
		std::cout << " --- StoneHouse BuildPart4 Done ! " << std::endl;
	}
	virtual void BuildPart5() {
		std::cout << " --- StoneHouse BuildPart5 Done ! " << std::endl;
		std::cout << " === Finish All Build House Done ! " << std::endl;
	}
};

int StoneHouseBuilder::CountPart2 = 0;

class HouseDirector {
public:
	HouseBuilder* pHouseBuilder;

	HouseDirector(HouseBuilder* pHouseBuilder) {
		this->pHouseBuilder = pHouseBuilder;
	}

	House* Construct() {
		pHouseBuilder->BuildPart1();

		for (int i = 0; i < 4; i++) {
			pHouseBuilder->BuildPart2();
		}

		bool flag = pHouseBuilder->BuildPart3();

		if (flag) {
			pHouseBuilder->BuildPart4();
		}

		pHouseBuilder->BuildPart5();

		return pHouseBuilder->GetResult();
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值