學習設計模式——工廠模式、抽象工廠模式

工廠模式

工廠模式 (Factory Pattern),根據不同的輸入返回不同類的實例,一般用來創建同一類對象。工廠方式的主要思想是將對象的創建與對象的實現分離

抽象工廠

抽象工廠 (Abstract Factory):通過對類的工廠抽象使其業務用於對產品類簇的創建,而不是負責創建某一類產品的實例。關鍵在於使用抽象類制定了實例的結構,調用者直接面向實例的結構編程,從實例的具體實現中解耦。

工廠模式,顧名思義,就相當於一間工廠,工廠可以添加不同的模具,製造不同系列的產品,比如生產飛機,大炮。

抽象工廠,顧名思義,定義的是抽象的概念,沒有定義如何實現。比如沈飛工廠生產飛機,定義抽象類“飛機”,具體實現,可以生產容量較大的C919客機,可以生產殲-20戰鬥機,B-20轟炸機。具體型號的飛機是實現,它們都符合 “飛機” 這個抽象類。

抽象類實現

/* 抽象類,ES5 構造函數方式 */
// var AbstractEs5 = function() {
//   if(new.target === AbstractEs5) {
//     throw new Error('抽象類不能實例化')
//   }
// }
// AbstractEs5.prototype.fly = function() {
//   throw new Error('抽象類方法不能調用')
// }

//  抽象工廠 飛機製造廠
class AbstractFactory  {
  constructor() {
    if(new.target === AbstractFactory) {
      throw new Error('抽象類不能實例化')
    }
  }
  // 抽象製造方法,我只會說要造什麼,我不會造
  createProduct() {
    throw new Error('抽象類方法不能調用')
  }
}

// 我是抽象飛機,我是一款概念產品
class AbstractPlane {
  constructor(){
   if(new.target === AbstractPlane) {
      throw new Error('抽象類不能實例化')
    }
  }
  fly() {
    throw new Error('抽象類方法不能調用')
  }
}

// 具體工廠模式,沈飛製造廠
class FactoryShenFei extends AbstractFactory {
  constructor() {
    super()
  }
  /** todo: 內部可以使用策略模式,這裏簡單用 switch-case
   * 實現抽象製造方法,我知道如何造飛機,我有很多模具
  */
  createProduct(type) {
    switch(type) {
      case 'C919客機':
        return new C919Plane(type);
      break;
      case '殲-20戰鬥機':
        return new Jian20(type);
      break;
      case 'B-20轟炸機':
        return new B20Hong(type);
      break;
      default:
        return new PrintWorks('工廠沒活幹就喜歡開動印鈔機');
      break;
    }
  }
}

// 我是c919客機模具
class C919Plane extends AbstractPlane{
  constructor(name) {
    super()
    console.log(`我是${name}具體產品`)
  }
  fly() {
    console.log('我可以飛得很猛,載客量大,安全第一')
  }
}

// 我是殲20戰鬥機模具
class Jian20 extends AbstractPlane{
  constructor(name) {
    super()
    console.log(`我是${name}具體產品`)
  }
  fly() {
    console.log('我可以飛得很快,咻咻咻')
  }
}

// 我是B20轟炸機模具
class B20Hong extends AbstractPlane{
  constructor(name) {
    super()
    console.log(`我是${name}具體產品`)
  }
  fly() {
    console.log('我可以飛得很久,載蛋量大,轟轟轟')
  }
}

var F1 = new FactoryShenFei()
var C9 = F1.createProduct('C919客機')
C9.fly()

var J20 = F1.createProduct('殲-20戰鬥機')
J20.fly()

var B20 = F1.createProduct('B-20轟炸機')
B20.fly()

工廠模式和抽象工廠模式的區別:

工廠模式 主要關注單獨的產品實例的創建;
抽象工廠模式 主要關注產品類簇實例的創建,如果產品類簇只有一個產品,那麼這時的抽象工廠模式就退化爲工廠模式了;
根據場景靈活使用即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章