首页/开发/代码质量与评审速查/建造者 Builder(创建型)
设计原则与模式62 条

建造者 Builder(创建型)

把复杂对象的构造过程与表示分离:逐步设置参数、最后 build() 产出不可变对象;适合参数多、有可选组合、需要校验的构造场景。

建造者模式是什么

建造者把复杂对象的构造过程与最终表示分离:逐步设置参数,最后调用构建方法产出成品,通常是一个不可变对象。它适合参数多、存在可选组合、构造时需要校验的场景,比多参数构造函数更易读,也不会出现半成品对象外泄。

基本信息

意图分步构造加最终校验
收益构造代码可读、产出对象可不可变
常见变体流畅接口、注解处理器生成的构建器
适用信号构造参数超过四个、可选参数多
配套约定构建时校验必填项与互斥项

典型使用场景

  • 构造参数多、且多数可选的配置对象
  • 需要产出不可变对象,禁止中途修改
  • 存在互斥或必填组合,构造时必须校验
  • 测试数据构建:默认值加少量覆盖
  • 构造过程分多步且顺序有意义

Java 示例

Java 示例
Pizza pizza = new Pizza.Builder(12)
    .cheese(true)
    .pepperoni(true)
    .build();
// 构建方法内部校验必填项与互斥组合,返回不可变对象
// 对象只在构建完成时交给调用方,中途不会外泄

与其他构造方式的对比

方式适用不足
多参数构造函数参数少且固定调用处难读,容易传错顺序
重叠构造函数参数逐层增加组合爆炸,维护困难
建造者参数多且有可选组合代码量增加,简单对象不划算
可变设置方法组装脚本或配置装配对象可能处于半成品状态
建造者与部分构造的差别在于可见性:对象只在构建完成时才交给调用方,中途不会泄漏,因此不会出现半成品状态被使用的情况。
构建方法不做校验,非法组合照样产出:校验被推到使用处,对象一旦创建就无法保证自洽。
设置方法的参数也要防错:给数值或字符串字段改用有语义的类型(金额对象、带单位的时长),比在构建方法里做范围校验更早暴露问题。

易错点

  • 每个字段都配建造者:简单对象的代码量与维护成本翻倍
  • 构建方法不做校验:非法组合照常产出,问题在运行期才暴露
  • 建造者对象被复用:上一次设置残留到下一次构造,数据串味
  • 产出对象仍可修改:分步构造的意义被削弱,共享时出现意外改动

数据来源与参考

  • 《设计模式》(GoF)· Builder
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌