在原型开发或早期迭代中,Builder 模式的价值不仅在于让代码更干净,更在于它能让你不关注复杂构造、不提前定义全部字段,也能快速“搭”出可用对象。下面几个技巧非常实用,且贴近真实开发。
1. 用默认值覆盖“我不关心的部分”
原型阶段很多字段不需要精确值,只想让对象跑通逻辑。Builder 可以为每个字段设置合理默认值,调用方只需设置自己关心的字段。
User user = User.builder()
.name("测试账号")
.build(); // email、role 等都自动取默认值,不用传参
技巧:默认值可以直接写在 Builder 的字段初始化里,或者写在 build() 方法中,保证即使不传也不会 NPE。
2. 链式调用让“改一个值”就像改配置
原型调试时常需要改一个字段重新跑。Builder 的链式调用可以把对象创建写成一行,复制粘贴后只改一个字段即可快速变体。
// 正常用户
User normal = User.builder().name("A").status("active").build();
// 仅把状态改成 banned 的异常用户
User banned = User.builder().name("A").status("banned").build();
这种模板式修改非常适合拼装出多种测试数据,不用每次重写构造器。
3. 用“部分构建”做阶段性原型
不必等到所有字段就绪再 build()。Builder 对象本身可以当作状态容器提前传递,在不同方法里分步填充,最后统一构建。
User.UserBuilder builder = User.builder()
.name("张三");
// 某条件分支设置权限
if (isAdmin) {
builder.role("admin");
}
User user = builder.build(); // 最后统一构建
这在原型中写条件分支、读配置拼对象时特别直观,省去临时变量和多重构造。
4. 套娃 Builder 处理“对象嵌套”
原型中经常需要构造嵌套对象(如订单里含用户、地址)。可以为每个复杂字段也配上 Builder,利用一个顶层 Builder 串联。
Order order = Order.builder()
.orderId("001")
.buyer(User.builder().name("李四").build()) // 内嵌 Builder
.address(Address.builder().city("北京").build())
.build();
这种做法让“手写测试数据”像填表格,不用关心内部构造顺序。
5. 用 IDE 生成 Builder 的“骨架”(或用 Lombok)
真实场景中不可能手写所有 Builder 类。原型阶段直接:
- 使用 Lombok 的
@Builder注解,1 秒生成。 - 或者在 IntelliJ IDEA 中用
InnerBuilder插件/Generate → Builder 自动生成内部 Builder 类。
注意:原型环境中可暂时忽略所有校验,让 Builder 先跑通再说;后续再补校验和不可变规则。
6. 一次性 build 出“预制样本”集合
把常用的几种对象样本写成静态方法或常量 Builder,后续测试随意取用。
public class PrototypeFixtures {
public static User regularUser() {
return User.builder().name("普通用户").role("user").build();
}
public static User adminUser() {
return User.builder().name("管理员").role("admin").build();
}
}
原型阶段可直接调用 PrototypeFixtures.adminUser(),极大减少重复构造代码。
总结一句话:在原型阶段,Builder 模式让你不再被构造器参数列表绑架——想填就填、想默认就默认、想嵌套就嵌套,改一个值就能给出一版新对象,正是“快速出原型”需要的灵活性。