建造者模式是什么
建造者把复杂对象的构造过程与最终表示分离:逐步设置参数,最后调用构建方法产出成品,通常是一个不可变对象。它适合参数多、存在可选组合、构造时需要校验的场景,比多参数构造函数更易读,也不会出现半成品对象外泄。
基本信息
| 意图 | 分步构造加最终校验 |
|---|---|
| 收益 | 构造代码可读、产出对象可不可变 |
| 常见变体 | 流畅接口、注解处理器生成的构建器 |
| 适用信号 | 构造参数超过四个、可选参数多 |
| 配套约定 | 构建时校验必填项与互斥项 |
典型使用场景
- 构造参数多、且多数可选的配置对象
- 需要产出不可变对象,禁止中途修改
- 存在互斥或必填组合,构造时必须校验
- 测试数据构建:默认值加少量覆盖
- 构造过程分多步且顺序有意义
Java 示例
Java 示例
Pizza pizza = new Pizza.Builder(12)
.cheese(true)
.pepperoni(true)
.build();
// 构建方法内部校验必填项与互斥组合,返回不可变对象
// 对象只在构建完成时交给调用方,中途不会外泄与其他构造方式的对比
| 方式 | 适用 | 不足 |
|---|---|---|
| 多参数构造函数 | 参数少且固定 | 调用处难读,容易传错顺序 |
| 重叠构造函数 | 参数逐层增加 | 组合爆炸,维护困难 |
| 建造者 | 参数多且有可选组合 | 代码量增加,简单对象不划算 |
| 可变设置方法组装 | 脚本或配置装配 | 对象可能处于半成品状态 |
建造者与部分构造的差别在于可见性:对象只在构建完成时才交给调用方,中途不会泄漏,因此不会出现半成品状态被使用的情况。
构建方法不做校验,非法组合照样产出:校验被推到使用处,对象一旦创建就无法保证自洽。
设置方法的参数也要防错:给数值或字符串字段改用有语义的类型(金额对象、带单位的时长),比在构建方法里做范围校验更早暴露问题。