建造者模式 - Builder

140 阅读1分钟

一、定义

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

二、核心

客户提出需求→指挥者根据用户需求,指挥建造者去完成需求的各个部分→建造者完成相应的部分。
主要有4个部分:product产品类、Builder建造者类、Director指挥者类、客户。

三、使用场景

需要生成的对象具有复杂得内部结构;且内部属性本身相互依赖。

四、实现

class Burger {
  constructor(builder) {
    this.size = builder.size
    this.cheeze = builder.cheeze || false
    this.pepperoni = builder.pepperoni || false
    this.lettuce = builder.lettuce || false
    this.tomato = builder.tomato || false
  }

  toString () {
    console.log('该汉堡属性:')
    for (let attr in this) {
      console.log(`${attr}: ${this[attr]}`)
    }
    // console.log(`size:${this.size}, cheeze:${this.cheeze}, pepperoni: ${this.pepperoni}, lettuce: ${this.lettuce}, to`)
  }
}

// 建造者:制作汉堡
class BurgerBuilder {
  constructor(size) {
    this.size = size
  }
  addPepperoni() {
    this.pepperoni = true
    return this
  }
  addLettuce() {
    this.lettuce = true
    return this
  }
  addCheeze() {
    this.cheeze = true
    return this
  }
  addTomato() {
    this.tomato = true
    return this
  }
  build() {
    return new Burger(this)
  }
}

// 直接使用
const burger = new BurgerBuilder(14)
  .addPepperoni()
  .addLettuce()
  .addCheeze()
  .addTomato()
  .build()
burger.toString()
console.log()

// (按照4个部分来)指挥者:指挥各个工作
class Director {
  action = (builder) => {
    builder.addPepperoni();
    builder.addLettuce();
    builder.addCheeze();
    builder.addTomato();
  }
}
// 客户使用方法
const burgerBuilder = new BurgerBuilder(18)
const director = new Director()
director.action(burgerBuilder)
const burger2 = burgerBuilder.build(); // 完成汉堡制作
burger2.toString()

// 输出:
该汉堡属性:
size: 14
cheeze: true
pepperoni: true
lettuce: true
tomato: true

该汉堡属性:
size: 18
cheeze: true
pepperoni: true
lettuce: true
tomato: true

与工厂模式的区别:

工厂模式:关注的是创建的结果,提供的是创建单个类的模式;
建造者模式:不仅得到了结果,同时也参与了创建的具体过程,适合用来创建一个复杂的复合对象。

跳转:设计模式目录