外观
一句话答案
工厂模式封装对象创建逻辑:简单工厂(静态方法 if-else)→工厂方法(子类决定)→抽象工厂(产品族)。
核心要点
建造者模式将复杂对象的构建过程与其表示分离,允许通过相同的构建过程创建不同的表示。
典型使用场景:
- 对象有大量可选参数(构造函数参数超过 4 个)
- 对象的构建步骤有固定顺序
- 需要创建不可变对象
现代 Java 中最常见的 Builder 写法(链式调用):
java
public class User {
private final String name; // 必选
private final String email; // 必选
private final int age; // 可选
private final String phone; // 可选
private User(Builder builder) {
this.name = builder.name;
this.email = builder.email;
this.age = builder.age;
this.phone = builder.phone;
}
public static class Builder {
private final String name;
private final String email;
private int age;
private String phone;
public Builder(String name, String email) {
this.name = name;
this.email = email;
}
public Builder age(int age) { this.age = age; return this; }
public Builder phone(String phone) { this.phone = phone; return this; }
public User build() { return new User(this); }
}
}
// 使用:链式调用,清晰易读
User user = new User.Builder("张三", "zs@test.com")
.age(25)
.phone("13800138000")
.build();Lombok 简化版:
java
@Builder
@Data
public class User {
private String name;
private String email;
private int age;
private String phone;
}
// 使用
User user = User.builder().name("张三").email("zs@test.com").build();Builder vs Factory 的区别:
| 维度 | Builder 模式 | Factory 模式 |
|---|---|---|
| 关注点 | 构建过程——怎么一步步组装 | 创建结果——创建哪种产品 |
| 产品复杂度 | 适合复杂对象(多属性、多步骤) | 适合简单对象或产品族 |
| 构建步骤 | 可控制构建顺序,支持可选参数 | 一步到位,无中间构建状态 |
| 典型场景 | StringBuilder、Protobuf Message | BeanFactory、Calendar.getInstance() |
Java/框架中的 Builder 实例:
StringBuilder/StringBufferStream.builder()OkHttpClient.BuilderLombok @Builder
追问与易错
追问方向:
- 简单工厂违反什么原则?
- BeanFactory 是哪种工厂?
- 抽象工厂适合什么?
易错点:
- ❌ 工厂方法和抽象工厂一样——前者一个产品后者一系列
- ❌ new 就行不需要工厂——工厂解耦创建逻辑
💡 记忆锚点
造车三级工厂:简单工厂是一个师傅看订单造不同车(if-else),工厂方法是每种车一条专线(子类决定),抽象工厂是整个品牌产线造全套(轮子+发动机+座椅一族产品)。BeanFactory就是Spring的造车总厂。