1. Builder 模式

构建者(Builder)模式主要用于创建结构复杂的对象。这种复杂性通常体现在对象的创建过程不能简单地通过一组构造参数完成,而是需要分步骤构建。Builder 模式有两个主要变种:简单 Builder 和经典 Builder。

1.1. 简单 Builder

适用于对象有多个可选字段,使用构造器重载会导致代码臃肿且易出错的场景。例如:

public class User {
    private String firstName;
    private String lastName;
    private int age;
    private String address;
    // ...其他字段
}

如果使用构造器重载,需要写多个构造方法,容易混淆参数顺序,也难以维护。此时使用 Builder 模式可以清晰地构建对象:

User user = new UserBuilder()
    .setFirstName("John")
    .setLastName("Doe")
    .setAge(30)
    .build();

✅ 优点:

  • 代码可读性强
  • 支持链式调用
  • 避免参数顺序错误

❌ 缺点:

  • 对于不可变对象(immutable)更友好,但如果是可变对象,Builder 本身可能需要额外状态管理

1.2. 经典 Builder

适用于结构复杂的对象,比如组合模式(Composite)中的对象,比如一个部门包含多个子部门,构建过程需要递归或分步骤完成。

在这种模式中,引入了 Director 类,负责调用 Builder 的各个步骤,完成复杂对象的组装。

public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}

✅ 优点:

  • 支持复杂的对象结构
  • 可以复用构建逻辑(Director)
  • 分离构建逻辑与表示

1.3. 小结

类型 适用场景 特点
简单 Builder 多参数、可选字段的对象构建 提高可读性、避免构造器膨胀
经典 Builder 结构复杂、组合结构的对象构建 分步骤构建、支持 Director

2. Factory 模式

工厂(Factory)模式主要用于封装对象的创建逻辑,提供统一的创建入口,同时支持多态。

2.1. 工厂惯用法(Factory Idiom)

这是一种轻量级实现,通常用于解决以下两个问题:

  • 单一职责原则:将创建逻辑从业务逻辑中分离
  • 避免代码重复:统一对象创建逻辑,便于维护

例如:

public class UserFactory {
    public static User createUser(String type) {
        if ("admin".equals(type)) {
            return new AdminUser();
        } else {
            return new RegularUser();
        }
    }
}

✅ 优点:

  • 简洁
  • 易于实现
  • 不需要复杂的继承结构

❌ 缺点:

  • 扩展性有限,适合简单场景

2.2. 工厂模式(Factory Pattern)

与模板方法模式类似,但用于对象创建。支持多态,能根据不同的输入返回不同的子类实例。

public interface ShapeFactory {
    Shape createShape();
}

public class CircleFactory implements ShapeFactory {
    public Shape createShape() {
        return new Circle();
    }
}

✅ 优点:

  • 支持扩展
  • 封装对象创建逻辑
  • 支持运行时决定具体类型

2.3. 抽象工厂(Abstract Factory)

用于创建一组相关或依赖对象的家族,这些对象属于不同的类层次结构,但具有共同的主题。比如创建不同风格的 UI 元素(Windows 风格、Mac 风格):

public interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

✅ 优点:

  • 封装一组相关对象的创建
  • 支持产品族的统一配置
  • 符合开闭原则

❌ 缺点:

  • 增加系统复杂度
  • 接口扩展成本高

3. 使用前提与设计意图对比

模式 使用前提 设计意图
Builder 对象结构复杂、需要分步骤构建 构建复杂对象,隐藏创建细节
Factory 对象创建简单、需要封装或多态 封装创建逻辑,支持多态和扩展

⚠️ 踩坑提醒:

  • 不要将 Builder 用于简单对象,否则是过度设计
  • Factory 模式中,不要把业务逻辑和创建逻辑混在一起
  • Abstract Factory 适合产品族,不建议用于单个对象创建

4. 总结对比

对比维度 Builder 模式 Factory 模式
目的 构建结构复杂对象 封装对象创建逻辑
是否分步骤 ✅ 是 ❌ 否
是否支持多态 ❌ 否 ✅ 是
是否适合组合结构 ✅ 是 ❌ 否
是否封装创建逻辑 ✅ 是 ✅ 是
适用对象类型 复杂、多字段、组合结构 简单、需要多态或统一创建入口

✅ 一句话总结:

Builder 用于构建复杂对象(结构复杂),Factory 用于统一和封装对象创建(逻辑复杂)。两者虽都属于创建型模式,但解决的问题不同,使用时应根据对象的复杂度和创建需求来选择。


原始标题:Builder Pattern vs. Factory Pattern

» 下一篇: DRY 软件设计原则