建造者模式是解决构造参数过多且高度可选问题的首选方案,适用于配置类、dto等场景;通过静态内部builder类、私有构造器、链式with方法、build校验、快捷工厂方法、能力接口分组及不可变对象设计,实现清晰、灵活、安全的构建流程。

建造者模式是解决“构造参数过多且高度可选”问题的首选方案,尤其适合配置类、DTO、请求对象等含大量可选字段的场景。关键不在于写个Builder类,而在于让调用清晰、扩展灵活、使用安全。
用静态内部类封装Builder,隔离构建逻辑
把Builder定义为目标类的静态内部类,既能访问私有字段(配合setter或直接赋值),又避免外部误用未完成的对象。目标类构造器设为private,强制走Builder流程。
- Builder内部用普通字段暂存各属性值,不依赖额外容器(如Map),保证类型安全和IDE提示
- 每个withXXX()方法返回this,支持链式调用;方法名直白,比如withTimeoutMs(int)、withRetryCount(short)
- build()方法负责校验必填项(如id、url)、处理默认值(如未设超时则用3000)、并一次性创建不可变实例
为高频组合预设快捷构建入口
当某些字段总是一起出现(如测试环境常用“本地地址+无重试+5秒超时”),可在Builder上加静态工厂方法,减少重复代码。
- 例如:public static Builder forTest() { return new Builder().withHost("localhost").withRetryCount(0).withTimeoutMs(5000); }
- 也可提供带参数的快捷入口:forProduction(String region),内部自动设置地域相关默认值
- 这些方法不破坏原有Builder能力,只是语法糖,调用后仍可继续链式配置其他字段
用泛型+接口约束可选行为,避免过度膨胀
若部分字段属于某类能力(如“支持熔断”、“支持压缩”、“支持加密”),可将对应配置抽成独立接口,Builder只持有一个该接口实例。
- 定义CircuitBreakerConfig、CompressionConfig等小接口,各自封装相关字段和校验逻辑
- Builder中提供withCircuitBreaker(CircuitBreakerConfig)方法,而非十几个单独的熔断参数方法
- 这样既控制Builder方法数量,又让配置分组清晰,未来增减某类能力也不影响主Builder结构
生成不可变对象,杜绝后续篡改风险
最终构建出的实例所有字段应为final,且不提供任何setter。若需修改,必须新建Builder重新组装。
- 构造器内直接将Builder字段复制到final字段,不保留Builder引用
- 对集合类字段(如List
headers)做防御性拷贝:this.headers = new ArrayList(builder.headers) - 若业务允许部分字段运行时变更,可另设一个MutableXxx类,但主类保持不可变,明确区分用途











