ES6 实现抽象工厂模式

1,699 阅读1分钟

样例代码

class OS {
  constructor() {
    if (new.target === OS) {
      throw new Error('不能实例化抽象类')
    }
  }
}

// 定义具体操作系统的具体产品类
class AndroidOS extends OS {
  constructor() {
    super()
  }
  controlHardWare() {
      console.log('我会用安卓的方式去操作硬件')
  }
}

class HardWare {
  constructor() {
    if (new.target === HardWare) {
      throw new Error('不能实例化抽象类')
    }
  }
  // 手机硬件的共性方法,这里提取了“根据命令运转”这个共性
  operateByOrder() {
      throw new Error('抽象产品方法不允许直接调用,你需要将我重写!');
  }
}

// 定义具体硬件的具体产品类
class QualcommHardWare extends HardWare {
  constructor() {
    super()
  }

  operateByOrder() {
      console.log('我会用高通的方式去运转')
  }
}


class MobilePhoneFactory {
  constructor() {
    if (new.target === MobilePhoneFactory) {
      throw new Error('不能实例化抽象类')
    }
  }

  // 提供操作系统的接口
  createOS() {
    throw new Error("抽象工厂方法不允许直接调用,你需要将我重写!");
  }

  // 提供硬件的接口
  createHardWare() {
    throw new Error("抽象工厂方法不允许直接调用,你需要将我重写!");
  }
}


class FakeStarFactory extends MobilePhoneFactory {
  constructor() {
    super()
  }

  createOS() {
    // 提供安卓系统实例
    return new AndroidOS()
  }

  createHardWare() {
    // 提供高通硬件实例
    return new QualcommHardWare()
  }
}


var ff = new FakeStarFactory()
console.log(ff)
let os = ff.createOS()
console.log(os)
os.controlHardWare()

console.log(new MobilePhoneFactory())

参考地址

  1. juejin.cn/book/684473…
  2. juejin.cn/post/684490…