01-构建器
构建器 — Rust Design Patterns
2 分钟阅读
译文 · 基于 Rust Design Patterns
原文链接: https://rust-unofficial.github.io/patterns/patterns/creational/builder.html
构建器
描述
通过调用构建器辅助对象来构造对象。
示例
| |
动机
当你本来需要许多构造函数,或构造过程有副作用时,此模式很有用。
优点
将构建方法与其他方法分离。
防止构造函数激增。
既可用于一行式初始化,也可用于更复杂的构造。
当你向目标结构体添加新字段时,可以更新构建器,同时保持客户端代码向后兼容。
缺点
比直接创建结构体对象或使用简单的构造函数更复杂。
讨论
此模式在 Rust 中出现得比许多其他语言更频繁(即便对象较简单也是如此),因为 Rust 没有函数重载和函数参数默认值。由于同名方法只能有一个,多个构造函数在 Rust 中不如在 C++、Java 等语言中那么优雅。
此模式常用于构建器对象本身就有独立价值、而不只是构建工具的场景。例如,参见
std::process::Command
是
Child(一个进程)的构建器。
在这些情况下,不会使用 T 与 TBuilder 的命名模式。
示例中按值接收并返回构建器。更符合人体工程学(也往往更高效)的做法是以可变引用接收并返回构建器。借用检查器会让这种方式自然成立。这种方法的优点是可以写出如下代码:
let mut fb = FooBuilder::new();
fb.a();
fb.b();
let f = fb.build();
同时也支持 FooBuilder::new().a().b().build() 风格。
参见
- 风格指南中的描述
- derive_builder,一个自动实现此模式从而避免样板代码的 crate。
- 构造器模式,适用于构造更简单的情况。
- 构建器模式(Wikipedia)
- 复杂值的构造