传统对象创建方式
// 方式1:空构造+Setter
ShoppingCart cart = new ShoppingCart();
cart.setUserId(123L);
cart.setItemId(1001);
// 方式2:全参构造
ShoppingCart cart = new ShoppingCart(
123L, 1001, "商品A", 2, ...);
特点:
-
需要显式调用多个setter方法
-
全参构造需要严格参数顺序
-
对象状态分步构建,存在中间不一致状态
构建器模式
ShoppingCart cart = ShoppingCart.builder()
.userId(123L)
.itemId(1001)
.name("商品A")
.build();
特点:
-
链式方法调用
-
参数设置顺序自由
-
通过
build()
一次性生成完整对象 -
支持可选参数和默认值
2. 代码示例解析
原始代码
ShoppingCart shoppingCart = ShoppingCart.builder()
.userId(BaseContext.getCurrentId()).build();
List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
等效传统实现
ShoppingCart query = new ShoppingCart();
query.setUserId(BaseContext.getCurrentId());
// 需要显式设置其他字段为null(如果必要)
List<ShoppingCart> list = shoppingCartMapper.list(query);
3. 构建器模式的实现原理
Lombok生成的Builder结构
public class ShoppingCart {
private Long userId;
private Long itemId;
// 其他字段...
@Builder
public static class Builder {
private Long userId;
private Long itemId;
public Builder userId(Long userId) {
this.userId = userId;
return this;
}
public ShoppingCart build() {
ShoppingCart cart = new ShoppingCart();
cart.setUserId(this.userId);
// 其他字段设置...
return cart;
}
}
}
4. 对比维度
维度 | 传统方式 | 构建器模式 |
---|---|---|
代码可读性 | 低(分散的setter调用) | 高(链式调用) |
参数灵活性 | 需要处理所有参数 | 按需设置可选参数 |
线程安全性 | 分步设置可能产生中间状态 | build()生成完整对象 |
可维护性 | 修改参数需调整多处 | 只需修改Builder类 |
适合场景 | <5个参数的简单对象 | 复杂对象/多可选参数场景 |
5. 最佳实践建议
-
优先使用构建器模式当:
-
对象有超过4个属性
-
存在多个可选参数
-
需要创建不可变对象
-
参数之间存在依赖关系(如校验逻辑)
-
-
适合使用传统方式当:
-
简单值对象(如仅包含id和name)
-
需要快速原型开发
-
明确知道所有参数值
-
-
注意事项:
-
避免构建器过度设计:简单对象不需要Builder
-
对必填字段应在build()方法中做校验
-
考虑使用Lombok简化代码
-
6. 性能考量
操作 | 传统方式 | 构建器模式 |
---|---|---|
对象创建速度 | 快 | 稍慢(需创建Builder实例) |
内存占用 | 低 | 略高(临时Builder对象) |
可维护性成本 | 高 | 低 |
扩展性 | 差 | 优秀 |
注意:在非高频创建场景下,性能差异可忽略不计