建造者模式

101 阅读3分钟

一、什么是建造者模式

建造者模式是一种用于逐步构建复杂对象的创建型设计模式。它允许您使用相同的构建过程生成不同类型和表示的对象。当对象需要用大量可选组件或配置进行构建时,该模式尤为有用。

二、简单示例

<template>
  <div>
    <p>{{ product.part_a }}</p>
    <p>{{ product.part_b }}</p>
    <p>{{ product.part_c }}</p>
  </div>
</template>

<script>
// 产品类:正在构建的对象
class Product {
  constructor() {
    this.part_a = null;
    this.part_b = null;
    this.part_c = null;
  }
}

// 建造者接口:指定构建产品的步骤
class Builder {
  buildPartA() {}
  buildPartB() {}
  buildPartC() {}
  getResult() {}
}

// 具体建造者:实现建造者接口以构建产品
class ConcreteBuilder extends Builder {
  constructor() {
    super();
    this.product = new Product();
  }

  buildPartA() {
    this.product.part_a = "零件A";
  }

  buildPartB() {
    this.product.part_b = "零件B";
  }

  buildPartC() {
    this.product.part_c = "零件C";
  }

  getResult() {
    return this.product;
  }
}

// 指挥者:使用建造者管理构建过程
class Director {
  constructor(builder) {
    this.builder = builder;
  }

  construct() {
    this.builder.buildPartA();
    this.builder.buildPartB();
    this.builder.buildPartC();
  }
}

export default {
  data() {
    return {
      product: null,
    };
  },
  mounted() {
    const builder = new ConcreteBuilder();
    const director = new Director(builder);

    director.construct();
    this.product = builder.getResult();
  },
};
</script>

//示例中,`Product`是正在构建的对象,`Builder`是构建产品的接口,
//`ConcreteBuilder`是`Builder`接口的实现,`Director`管理构建过程。
//客户端代码创建了一个`ConcreteBuilder`,将其传递给`Director`,
//然后启动构建过程。最终,获取构建的产品并在Vue组件中使用。

通俗的讲: 建造者模式的关键是分步构建复杂对象,使得同样的构建过程可以创建不同的表示。客户端可以根据需要选择使用不同的具体建造者。

建造者模式的主要目的是将一个复杂对象的构建过程和其表示分离,使得同样的构建过程可以创建不同的表示。这有助于更灵活地构建不同类型的对象,而不必改变构建过程的代码。

在我的前一个例子中,Director负责管理构建过程,但客户端可以选择使用不同的具体建造者。这种方式允许客户端根据需要构建不同类型的产品,而不是一次性构建所有可能的产品。

所以,建造者模式的主要思想是允许客户端有选择地构建产品的一部分,而不是一次性构建整个产品。这样的设计有助于更好地应对复杂对象的创建需求。

通常的使用场景

  1. 创建复杂对象: 当需要创建的对象具有复杂的内部结构,包含多个部分或步骤,且这些部分之间的组合方式可以灵活变化时,可以使用建造者模式。
  2. 同一构建过程,不同表示: 如果存在多个表示或配置,但构建过程相同,可以使用建造者模式。这样,可以使用不同的建造者来构建具有相同步骤的不同表示的对象。
  3. 避免构造者过于庞大: 当一个类的构造函数参数过多,或者存在多个构造函数,为了避免构造函数的参数列表过于庞大,可以使用建造者模式,将构造函数的参数拆分到不同的方法中。
  4. 创建不可变对象: 如果希望创建的对象是不可变的,即一旦创建就不能修改其内部状态,建造者模式可以通过在构建过程中逐步构建不可变对象来实现。
  5. 更好的封装性: 建造者模式提供了更好的封装性,客户端代码只需关心指挥者和建造者,而不需要知道具体产品的构建细节。