文章目录
-
- [1. 引言:构造函数为什么会"失控"?](#1. 引言:构造函数为什么会“失控”?)
- [2. 什么是建造者模式(亦称生成器模式)](#2. 什么是建造者模式(亦称生成器模式))
-
- [GoF 定义](#GoF 定义)
- [3. 建造者模式的核心思想](#3. 建造者模式的核心思想)
- [4. 建造者模式的角色组成](#4. 建造者模式的角色组成)
- [5. 示例场景:构建一个电脑对象](#5. 示例场景:构建一个电脑对象)
-
- [5.1 产品类](#5.1 产品类)
- [5.2 客户端使用](#5.2 客户端使用)
- [6. Director 的角色(可选)](#6. Director 的角色(可选))
- [7. 建造者模式的优点](#7. 建造者模式的优点)
- [8. 建造者模式的缺点](#8. 建造者模式的缺点)
- [9. 适用场景](#9. 适用场景)
- [10. 建造者模式 vs 构造函数](#10. 建造者模式 vs 构造函数)
- [11. JDK 中的建造者模式](#11. JDK 中的建造者模式)
-
- `StringBuilder`
- [`StringBuilder` / `StringBuffer`](#
StringBuilder/StringBuffer)
- [12. 建造者模式的一个常见误区](#12. 建造者模式的一个常见误区)
- 参考

1. 引言:构造函数为什么会"失控"?
在实际开发中,我们经常会遇到这样的类:
java
public class User {
private String username;
private String password;
private int age;
private String phone;
private String address;
private String email;
public User(String username, String password, int age,
String phone, String address, String email) {
...
}
}
问题显而易见:
- 构造函数参数过多,可读性差
- 参数顺序容易写错
- 可选参数只能传
null - 对象一旦创建,很难保证一致性和完整性
当对象的创建过程开始变得"复杂"时,建造者模式就该登场了。
2. 什么是建造者模式(亦称生成器模式)
GoF 定义
将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
一句话理解:
把"怎么一步步组装对象"从对象本身中抽离出来。
3. 建造者模式的核心思想
建造者模式主要解决三个问题:
- 构造参数过多的问题
- 对象创建过程复杂的问题
- 创建不同"配置版本"的对象问题
其核心思想是:
分步骤构建 + 最终一次性生成对象。
4. 建造者模式的角色组成
建造者模式通常包含四个角色:
- 产品类(Product)
要创建的复杂对象。
- 抽象建造者类(Builder)
这个接口规定要实现复杂对象的那些部分的创建,并不涉及具体的部件对象的创建。
- 具体建造者类(ConcreteBuilder)
实现 Builder 接口,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例。
- 指挥者类(Director,可选)【监工】
调用具体建造者来创建复杂对象的各个部分,在指导者中不涉及具体产品的信息,只负责保证对象各部分完整创建或按某种顺序创建。
结构示意:

在实际 Java 项目中,Director 往往被省略。
5. 示例场景:构建一个电脑对象
5.1 产品类
java
public class Computer {
private final String cpu;
private final String ram;
private final String disk;
private final String gpu;
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.disk = builder.disk;
this.gpu = builder.gpu;
}
public static class Builder {
private String cpu;
private String ram;
private String disk;
private String gpu;
public Builder cpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder ram(String ram) {
this.ram = ram;
return this;
}
public Builder disk(String disk) {
this.disk = disk;
return this;
}
public Builder gpu(String gpu) {
this.gpu = gpu;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
5.2 客户端使用
java
public class Client {
public static void main(String[] args) {
Computer computer = new Computer.Builder()
.cpu("Intel i9")
.ram("32GB")
.disk("1TB SSD")
.gpu("RTX 4090")
.build();
}
}
优点一目了然:
- 语义清晰
- 参数顺序不敏感
- 可选参数自由组合
6. Director 的角色(可选)
java
public class ComputerDirector {
public Computer buildGamingPC(Computer.Builder builder) {
return builder
.cpu("AMD Ryzen 9")
.ram("64GB")
.disk("2TB SSD")
.gpu("RTX 4090")
.build();
}
}
Director 的作用:
- 固定构建流程
- 封装"套餐配置"
7. 建造者模式的优点
- 解决构造函数参数爆炸
- 提升代码可读性
- 支持不可变对象
- 构建过程清晰、可控
- 同一构建流程可生成不同对象
8. 建造者模式的缺点
- 类数量增多
- 结构相对复杂
- 不适合简单对象
9. 适用场景
适合使用:
- 对象属性多、可选参数多
- 构建步骤固定但配置灵活
- 需要不可变对象
- API 设计(非常常见)
不适合使用:
- 对象非常简单
- 构建成本低
- 追求极简代码的场景
造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
10. 建造者模式 vs 构造函数
| 维度 | 构造函数 | 建造者模式 |
|---|---|---|
| 可读性 | 差 | 好 |
| 参数顺序 | 敏感 | 不敏感 |
| 可选参数 | 不友好 | 友好 |
| 不可变对象 | 难 | 易 |
11. JDK 中的建造者模式
StringBuilder
java
StringBuilder sb = new StringBuilder();
sb.append("Hello")
.append(" ")
.append("World");

StringBuilder / StringBuffer
- 分步构建
- 最终生成字符串
12. 建造者模式的一个常见误区
建造者模式 ≠ 为所有类都写 Builder。
只有当对象"复杂"到一定程度时,建造者模式才真正有价值。