Skip to content

建造者模式

约 732 字大约 2 分钟

设计模式

2018-05-06

什么是建造者模式?

Builder(建造者)模式 是一种创建型设计模式。

它用于分步骤构建复杂对象。 它通过将对象的构造过程与其表示分离,允许相同的构建过程创建不同的表示。

该模式的核心思想是:

  • 分离构建步骤:将对象的构建分解为多个独立步骤。
  • 统一构建流程:通过一个指挥者(Director)控制构建顺序。
  • 灵活组合:通过不同建造者(Builder)实现不同配置的对象。

实现建造者模式

下面是一个简单的示例,展示了建造者模式的实现:

// 1. 产品类(最终要构建的复杂对象)
class Pizza {
  constructor() {
    this.base = null
    this.sauce = null
    this.toppings = []
  }

  describe() {
    return `Pizza with ${this.base} base, ${this.sauce} sauce, and toppings: ${this.toppings.join(', ')}`
  }
}

// 2. 建造者接口(定义构建步骤)
class PizzaBuilder {
  constructor() {
    this.pizza = new Pizza()
  }

  prepareBase(base) {
    this.pizza.base = base
    return this // 返回this支持链式调用
  }

  addSauce(sauce) {
    this.pizza.sauce = sauce
    return this
  }

  addTopping(topping) {
    this.pizza.toppings.push(topping)
    return this
  }

  build() {
    return this.pizza
  }
}

// 3. 指挥者(可选,封装构建流程)
class PizzaDirector {
  constructor(builder) {
    this.builder = builder
  }

  makeMargherita() {
    return this.builder
      .prepareBase('thin crust')
      .addSauce('tomato')
      .addTopping('mozzarella')
      .addTopping('basil')
      .build()
  }

  makePepperoni() {
    return this.builder
      .prepareBase('thick crust')
      .addSauce('spicy tomato')
      .addTopping('pepperoni')
      .addTopping('cheese')
      .build()
  }
}

// 使用示例
const builder = new PizzaBuilder()

// 方式1: 直接使用建造者(链式调用)
const customPizza = builder
  .prepareBase('gluten-free')
  .addSauce('pesto')
  .addTopping('mushrooms')
  .addTopping('olives')
  .build()
console.log(customPizza.describe()) // Pizza with gluten-free base...

// 方式2: 通过指挥者创建预定义对象
const director = new PizzaDirector(builder)
const margherita = director.makeMargherita()
console.log(margherita.describe()) // Pizza with thin crust base...

优点

  • 分离构造与表示:将对象的构建细节封装在建造者中,客户端无需了解内部结构。
  • 灵活扩展:新增建造者即可支持新类型的对象,符合开闭原则。
  • 精细控制构建过程:分步构建允许精确控制对象配置。
  • 复用构建逻辑:指挥者封装通用构建流程,避免代码重复。
  • 链式调用:提供流畅接口(Fluent Interface),提升代码可读性。

缺点

  • 增加代码复杂度:需创建多个新类(产品、建造者、指挥者)。
  • 过度设计风险:简单对象直接构造更高效,无需使用此模式。
  • 建造者依赖:产品类发生变更时,所有建造者都需要同步修改。

适用场景

  • 构造复杂对象:当对象需要多个步骤/组件组合时(如配置复杂的 UI 组件)。
  • 不同对象变体:需要创建多个相似但配置不同的对象(如不同套餐的 Pizza)。
  • 避免构造函数参数爆炸:当构造函数参数过多(>4个)且部分可选时。
  • 不可变对象:配合返回新对象的链式调用,适合构建不可变对象。
  • 多步骤构造过程:当对象构造需要特定顺序或条件检查时。