构建器模式(Builder Pattern)与传统对象创建方式的对比

传统对象创建方式


// 方式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 list = shoppingCartMapper.list(shoppingCart);

等效传统实现

ShoppingCart query = new ShoppingCart();
query.setUserId(BaseContext.getCurrentId());
// 需要显式设置其他字段为null(如果必要)
List 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. 最佳实践建议

  1. 优先使用构建器模式

    • 对象有超过4个属性

    • 存在多个可选参数

    • 需要创建不可变对象

    • 参数之间存在依赖关系(如校验逻辑)

  2. 适合使用传统方式当

    • 简单值对象(如仅包含id和name)

    • 需要快速原型开发

    • 明确知道所有参数值

  3. 注意事项

    • 避免构建器过度设计:简单对象不需要Builder

    • 对必填字段应在build()方法中做校验

    • 考虑使用Lombok简化代码


6. 性能考量

操作 传统方式 构建器模式
对象创建速度 稍慢(需创建Builder实例)
内存占用 略高(临时Builder对象)
可维护性成本
扩展性 优秀

注意:在非高频创建场景下,性能差异可忽略不计

你可能感兴趣的:(java,设计模式,建造者模式)