Skip to content
进阶

一句话答案

工厂模式封装对象创建逻辑:简单工厂(静态方法 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 模式
关注点构建过程——怎么一步步组装创建结果——创建哪种产品
产品复杂度适合复杂对象(多属性、多步骤)适合简单对象或产品族
构建步骤可控制构建顺序,支持可选参数一步到位,无中间构建状态
典型场景StringBuilderProtobuf MessageBeanFactoryCalendar.getInstance()

Java/框架中的 Builder 实例:

  • StringBuilder / StringBuffer
  • Stream.builder()
  • OkHttpClient.Builder
  • Lombok @Builder
追问与易错

追问方向:

  • 简单工厂违反什么原则?
  • BeanFactory 是哪种工厂?
  • 抽象工厂适合什么?

易错点:

  • ❌ 工厂方法和抽象工厂一样——前者一个产品后者一系列
  • ❌ new 就行不需要工厂——工厂解耦创建逻辑

💡 记忆锚点

造车三级工厂:简单工厂是一个师傅看订单造不同车(if-else),工厂方法是每种车一条专线(子类决定),抽象工厂是整个品牌产线造全套(轮子+发动机+座椅一族产品)。BeanFactory就是Spring的造车总厂。