builder 模式也就是构建器模式,属于面向对象编程经典设计模式,核心作用是把复杂对象的分步创建过程和对象本身分离开,同一个构建流程可以生成不同表现形式的对象,这个模式最适合字段多 参数复杂的类,解决传统构造函数参数过多 传参混乱 可读性差的痛点,很多初学者容易把 builder 模式和普通 setter 链式调用混在一起,builder 模式不只是链式赋值,它包含独立 Builder 构建类 分步组装 最终 build 产出对象这套完整结构,Java C Kotlin 等语言都广泛使用,下面从原理 标准结构 代码实现 实战用法 注意事项完整讲解 builder 模式使用方法。
builder 模式核心原理
复杂对象包含大量属性,如果全部写在构造函数,会出现超长参数列表,调用的时候很容易把参数顺序填错
builder 模式单独创建 Builder 内部类,在 Builder 里面逐个设置属性,每一步返回 Builder 本身,支持链式调用
所有属性设置完成之后,调用 build 方法,校验参数合法性,最终生成目标实体对象
分离关注点,对象创建逻辑封装在 builder 里面,业务代码只需要关心赋值步骤,不需要了解对象内部组装细节
builder 模式标准组成清单
1 产品类 Product,也就是最终要创建的复杂对象,一般属性私有化,只提供 getter
2 抽象 Builder,可选,定义通用构建步骤接口,如果只有一种构建方案可以省略
3 具体 Builder,核心类,保存待构建对象的临时属性,提供 set 方法,实现 build 方法
4 指挥者 Director,可选组件,用来固定标准化构建流程,简单项目一般不用 Director,业务直接调用 builder
Java 基础实战代码步骤
第一步 创建产品类,定义全部成员变量,提供 get 方法,不提供多参数构造器
第二步 在产品类里面定义静态内部 Builder 类,声明和产品对应的临时变量
第三步 在 Builder 里面编写赋值方法,方法返回 this,实现链式调用
第四步 在 Builder 内部编写 build 方法,增加参数校验逻辑,校验通过之后 new 产品对象,把 builder 里面参数传入产品
第五步 业务调用方式 产品.builder (). 属性 1 (). 属性 2 ().build ()
链式调用示例逻辑
User user = User.builder ()
.name ("张三")
.age (20)
.phone ("13800000000")
.build ();
builder 模式适用场景
类拥有大量可选参数,必填和选填属性混杂
对象创建过程需要参数校验,在 build 阶段统一校验
需要同套构建逻辑,产出不同配置版本对象
不想暴露超长多参构造函数,提升代码可读性
不适合使用 builder 模式场景
对象属性很少,构造函数本身很短,强行写 builder 会增加冗余代码
对象创建逻辑非常简单,没有分步组装需求
项目团队规范不允许增加额外内部类,优先考虑其他方案
进阶扩展要点
不可变对象搭配 builder,产品类不提供 setter,所有属性在构建完成之后不能修改,这是 builder 最经典用法
Director 指挥者用法,把固定构建流程封装在 Director,调用者只需要传入 builder,Director 按顺序调用构建步骤,适合多套标准化组装流程
线程安全注意,普通 builder 实例不是线程安全,多线程并发使用同一个 builder 对象会出现属性错乱,每次构建新对象要新建 builder 实例
Kotlin 语言可以使用 data class 配合 Builder,Lombok 插件可以自动生成 builder 注解,不用手写完整 builder 代码
builder 模式和其他方案对比表格
方案 优点 缺点
builder 模式 参数清晰 支持校验 链式调用 需要额外编写 Builder 类
多参构造函数 代码简短 参数多容易顺序错误
setter 链式调用 写法简单 缺少统一校验 对象可变
常见踩坑点
build 方法忘记做必填项校验,导致空值对象被创建
Builder 没有返回 this,链式调用失效
产品类仍然保留 public setter,破坏不可变设计
重复创建 Builder 对象,造成不必要内存开销
【相关 FAQ】
问题 1 builder 模式主要解决什么问题
回答 1 builder 模式主要解决复杂类构造函数参数过多 参数顺序容易出错的问题,builder 模式通过分步链式赋值,提升对象创建代码可读性。
问题 2 builder 模式里面 build 方法作用是什么
回答 1 builder 模式里面 build 方法负责最终校验参数并且生成目标产品对象,是 builder 模式最后一步核心方法。
问题 3 builder 模式一定要使用 Director 指挥者吗
回答 1 builder 模式不是必须使用 Director 指挥者,Director 属于可选组件,简单业务场景可以直接调用 builder,不需要 Director。
问题 4 builder 模式生成的对象可以是不可变对象吗
回答 1 builder 模式非常适合生成不可变对象,产品类不开放 setter,所有属性在 builder 模式构建阶段一次性确定,构建完成之后无法修改属性。
免责申明
本内容为编程设计模式通用教学,不同编程语言语法存在差异,实际编码请结合对应语言规范与项目架构要求使用 builder 模式。


