你好,我是风一样的树懒,一个工作十多年的后端专家,曾就职京东、阿里等多家互联网头部企业。公众号“吴计可师”,已经更新了近百篇高质量的面试相关文章,喜欢的朋友欢迎关注点赞
建造者模式详解
一、定义与核心思想
建造者模式(Builder Pattern)是一种创建型设计模式,将复杂对象的构造过程与其表示分离,使得同样的构建过程可创建不同的对象形式。其核心在于分步构建与灵活组合,尤其适用于具有多个可选参数或复杂配置流程的对象。
二、适用场景
- 参数众多的构造函数:避免构造方法参数爆炸(Telescoping Constructor)。
- 多步骤构造过程:需按特定顺序或条件设置对象属性。
- 创建不可变对象:通过Builder生成最终不可变实例。
- 多种对象变体:同一构建流程可生成不同表现形式的对象(如豪华版/基础版配置)。
三、模式结构
角色 | 职责 |
---|---|
产品(Product) | 待构建的复杂对象(如计算机、报告文档)。 |
抽象建造者(Builder) | 定义构建步骤的接口(如设置CPU、内存等)。 |
具体建造者(Concrete Builder) | 实现构建接口,提供不同实现(如游戏电脑/办公电脑建造器)。 |
指挥者(Director) | 控制构建流程(可选),封装构造逻辑。 |
客户端(Client) | 通过指挥者或直接使用建造者创建对象。 |
四、实现示例:构建高性能计算机
// 产品类(不可变)
public class Computer {
private final String cpu;
private final String gpu;
private final int ram;
private final int storage;
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.gpu = builder.gpu;
this.ram = builder.ram;
this.storage = builder.storage;
}
// 静态内部建造者
public static class Builder {
private String cpu; // 必选参数
private String gpu = "集成显卡"; // 可选默认值
private int ram = 8; // 可选默认值
private int storage = 256; // 可选默认值
public Builder(String cpu) {
this.cpu = cpu;
}
public Builder gpu(String gpu) {
this.gpu = gpu;
return this;
}
public Builder ram(int ram) {
this.ram = ram;
return this;
}
public Builder storage(int storage) {
this.storage = storage;
return this;
}
public Computer build() {
validate(); // 参数校验
return new Computer(this);
}
private void validate() {
if (ram < 4) throw new IllegalArgumentException("内存至少4GB");
}
}
}
// 客户端使用
Computer gamingPC = new Computer.Builder("Intel i9")
.gpu("RTX 4090")
.ram(32)
.storage(1024)
.build();
五、核心优势
- 参数灵活:可选参数自由组合,避免构造方法重载。
- 代码可读性:链式调用清晰表达构建逻辑(如
.cpu().ram().build()
)。 - 不可变性保证:产品类属性可设为final,线程安全。
- 构建过程控制:通过Director统一管理复杂构建流程(如汽车组装步骤)。
六、变体与进阶技巧
-
Lombok简化:使用
@Builder
注解自动生成建造者类。@Builder public class User { private String name; private int age; } // 使用:User.builder().name("Alice").age(30).build();
-
级联建造者:处理嵌套对象构建。
public class Car { private Engine engine; private Wheel wheel; public static class Builder { private Engine.Builder engineBuilder = new Engine.Builder(); private Wheel.Builder wheelBuilder = new Wheel.Builder(); public Builder engine(String type) { engineBuilder.type(type); return this; } public Car build() { return new Car(engineBuilder.build(), wheelBuilder.build()); } } }
-
Director增强:封装典型配置方案。
public class ComputerDirector { public Computer buildGamingComputer() { return new Computer.Builder("AMD Ryzen 9") .gpu("RTX 4080") .ram(64) .storage(2048) .build(); } }
七、与工厂模式对比
维度 | 建造者模式 | 工厂模式 |
---|---|---|
关注点 | 分步构建复杂对象 | 直接创建完整对象 |
参数处理 | 支持多参数灵活组合 | 通常参数较少且固定 |
适用场景 | 对象构造流程复杂,需精细控制 | 快速生成标准对象 |
代码复杂度 | 较高(需定义Builder类) | 较低(集中式创建) |
八、应用案例
- Java标准库:
StringBuilder
、LocalDate.build()
。 - JSON解析库:Gson/Jackson通过Builder配置序列化规则。
- GUI框架:Android AlertDialog.Builder构建对话框。
- HTTP客户端:OkHttpClient.Builder配置超时、拦截器。
九、注意事项
- 过度设计:简单对象无需使用建造者模式。
- 线程安全:Builder本身非线程安全,需在build()时完成校验。
- 性能开销:额外Builder对象可能增加内存占用(可复用Builder优化)。
总结
建造者模式通过分步构建与链式调用,优雅解决了复杂对象创建难题。结合不可变对象与参数校验,可显著提升代码健壮性。在参数众多、构造流程复杂或需多版本对象的场景下,该模式是提升代码可维护性的利器。
今天文章就分享到这儿,喜欢的朋友可以关注我的公众号,回复“进群”,可进免费技术交流群。博主不定时回复大家的问题。
公众号:吴计可师