From 5f6a05c86af32b488c5e63891f6d01685b4d7403 Mon Sep 17 00:00:00 2001 From: Yuki Date: Sat, 5 Apr 2025 18:49:39 +0800 Subject: [PATCH] feat: Builder Implemented a demo for the Builder. --- 04_builder.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ notes.md | 8 ++++++ 2 files changed, 75 insertions(+) create mode 100644 04_builder.cpp diff --git a/04_builder.cpp b/04_builder.cpp new file mode 100644 index 0000000..8ab745a --- /dev/null +++ b/04_builder.cpp @@ -0,0 +1,67 @@ +#include +#include + +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; + unique_ptr mem; + + friend class Builder; +public: + void show() { + cout << "CPU: " << cpu->type << endl + << "Memory: " << mem->type << endl; + } +}; + +class Builder { +public: + unique_ptr c; + Builder() { + c = make_unique(); + } + + // Method chaining + Builder& set_cpu(string s) { + c->cpu = make_unique(s); + return *this; + } + + Builder& set_mem(string s) { + c->mem = make_unique(s); + return *this; + } + + unique_ptr 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(); +} diff --git a/notes.md b/notes.md index 9b854eb..5734fd0 100644 --- a/notes.md +++ b/notes.md @@ -17,3 +17,11 @@ 抽象工厂进一步的将工厂本身也作为一种产品。它定义了一个“工厂族”的接口,规定了工厂需要生产哪些种类的产品。客户端从抽象工厂获取一个具体的工厂,再从这个工厂中制造一组相互关联的具体产品。 这可以用于创建一系列相关或相互依赖的对象,而不指定它们的具体类。也就是说,它解决了产品族一致性的问题。这在组件风格切换、平台适配、多模块协作等方面很有用。 + +## 生成器模式(Builder) + +假定有一种复杂对象(比如电脑,需要有 CPU,内存,主板等),如何构建这种复杂对象呢?朴素的做法是有一个接受很多参数的构造函数,这显然不好,因为参数不总是都用上的。另一种做法是扩展电脑基类,但是这意味着给电脑增加新的外设会很复杂,因为需要添加子类。 + +解决方案是有一种生成器类专门负责构建复杂对象。对于每一种参数,生成器类定义了接受各个参数的函数,从而做到分步创建对象。参数输入结束后,生成器类可以基于之前输入的参数创建这一复杂对象。 + +对于复杂场景,比如生成器需要输入十种参数,可以添加一个指导者封装这些输入这几种参数的过程。它提供了一种简化的构建流程,客户端不需要关心构建细节,代价是牺牲了一定的灵活性,因为客户无法定制每一步。