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)
一、模式定义
构建器:将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。 ——《设计模式》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();
}
};