ES6 實現抽象工廠模式

樣例代碼

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.im/book/5c70fc…
  2. juejin.im/post/5cd966…
相關文章
相關標籤/搜索