feat: Builder
Implemented a demo for the Builder.
This commit is contained in:
parent
29102983de
commit
5f6a05c86a
67
04_builder.cpp
Normal file
67
04_builder.cpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
class CPU {
|
||||||
|
public:
|
||||||
|
string type;
|
||||||
|
CPU(string s) {
|
||||||
|
type = s;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Memory {
|
||||||
|
public:
|
||||||
|
string type;
|
||||||
|
Memory(string s) {
|
||||||
|
type = s;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Computer {
|
||||||
|
unique_ptr<CPU> cpu;
|
||||||
|
unique_ptr<Memory> mem;
|
||||||
|
|
||||||
|
friend class Builder;
|
||||||
|
public:
|
||||||
|
void show() {
|
||||||
|
cout << "CPU: " << cpu->type << endl
|
||||||
|
<< "Memory: " << mem->type << endl;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class Builder {
|
||||||
|
public:
|
||||||
|
unique_ptr<Computer> c;
|
||||||
|
Builder() {
|
||||||
|
c = make_unique<Computer>();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method chaining
|
||||||
|
Builder& set_cpu(string s) {
|
||||||
|
c->cpu = make_unique<CPU>(s);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Builder& set_mem(string s) {
|
||||||
|
c->mem = make_unique<Memory>(s);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
unique_ptr<Computer> build() {
|
||||||
|
// You can check if the computer is valid here.
|
||||||
|
return move(c);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
Builder b;
|
||||||
|
// You can pack `b.set().set()...build()` into a Director.
|
||||||
|
auto c = b
|
||||||
|
.set_cpu("Intel")
|
||||||
|
.set_mem("Samsung")
|
||||||
|
.build();
|
||||||
|
c->show();
|
||||||
|
}
|
||||||
8
notes.md
8
notes.md
@ -17,3 +17,11 @@
|
|||||||
抽象工厂进一步的将工厂本身也作为一种产品。它定义了一个“工厂族”的接口,规定了工厂需要生产哪些种类的产品。客户端从抽象工厂获取一个具体的工厂,再从这个工厂中制造一组相互关联的具体产品。
|
抽象工厂进一步的将工厂本身也作为一种产品。它定义了一个“工厂族”的接口,规定了工厂需要生产哪些种类的产品。客户端从抽象工厂获取一个具体的工厂,再从这个工厂中制造一组相互关联的具体产品。
|
||||||
|
|
||||||
这可以用于创建一系列相关或相互依赖的对象,而不指定它们的具体类。也就是说,它解决了产品族一致性的问题。这在组件风格切换、平台适配、多模块协作等方面很有用。
|
这可以用于创建一系列相关或相互依赖的对象,而不指定它们的具体类。也就是说,它解决了产品族一致性的问题。这在组件风格切换、平台适配、多模块协作等方面很有用。
|
||||||
|
|
||||||
|
## 生成器模式(Builder)
|
||||||
|
|
||||||
|
假定有一种复杂对象(比如电脑,需要有 CPU,内存,主板等),如何构建这种复杂对象呢?朴素的做法是有一个接受很多参数的构造函数,这显然不好,因为参数不总是都用上的。另一种做法是扩展电脑基类,但是这意味着给电脑增加新的外设会很复杂,因为需要添加子类。
|
||||||
|
|
||||||
|
解决方案是有一种生成器类专门负责构建复杂对象。对于每一种参数,生成器类定义了接受各个参数的函数,从而做到分步创建对象。参数输入结束后,生成器类可以基于之前输入的参数创建这一复杂对象。
|
||||||
|
|
||||||
|
对于复杂场景,比如生成器需要输入十种参数,可以添加一个指导者封装这些输入这几种参数的过程。它提供了一种简化的构建流程,客户端不需要关心构建细节,代价是牺牲了一定的灵活性,因为客户无法定制每一步。
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user