Skip to content

建造者模式

定义:将一个复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示

适用场景:

  1. 创建对象需要很多步骤,但是步骤的顺序不一定固定
  2. 创建的对象有非常复杂的内部结构(很多属性)
  3. 把复杂对象的创建和使用分离

优点:

  1. 封装性好,创建和使用分离

  2. 扩展性好,实体和建造类之间一定程度上解耦

缺点:

  1. 产生多余的 Builder 对象

  2. 产品内部发生改变,建造者的逻辑也要同步修改,成本较大

链式编程

建造者模式一般会采用链式编程

核心:建造者类持有实体,修改实体属性的方法需要返回自身

以订单为例Order.java

java
@Data
public class Order {
  private Integer id;
  private String name;
  private Double price;
}

订单的建造者OrderBuilder.java

java
public class OrderBuilder {
  private Order order = new Order();
  
  public OrderBuilder id(Integer id) {
    this.order.setId(id);
    return this;
  }
  
  public OrderBuilder name(String name) {
    this.order.setName(name);
    return this;
  }
  
  public OrderBuilder price(Integer price) {
    this.order.setPrice(price);
    return this;
  }
  
  public Order build() {
    return this.order;
  }
}

使用

java
public class User {
  public void static main(String args[]) {
    OrderBuilder orderBuilder = new OrderBuilder()
      .id(1)
      .name("123")
      .price(9800);
    Order order = orderBuilder.build();
    System.out.println(order);
  }
}

建造者模式在源码中的体现

StringBuilder

StringBuilder中的append方法,每次拼接字符串后会返回自身对象

BeanDefinitionBuilder

Spring中的BeanDefinitionBuilder也使用到了建造者模式,最终通过getBeanDefinition方法返回beanDefinition

建造者模式与工厂模式的区别

  • 建造者模式不仅要创建出对象,还需要了解这个对象由哪些部分组成,工厂模式只需要把对象创建出来即可
  • 建造者模式可以根据实际需求定制不一样的对象,工厂模式创建出来的对象都是统一的
  • 建造者更关注构建过程的定制,工厂模式更关注构建类型的结果