Factory 工廠模式

JavaScript Design Pattern「Factory 工廠模式」筆記。

Factory 的目的是建立物件,通常實作為一個 class,或 class 內的靜態方法。作用是:

實作方法

由 Factory 的 class 或 method 所建立的物件,會被設計成繼承同一個父物件,這些具體的 subclass 物件則各自實作專門的功能。有時這個公共的父物件也是容納 factory 方法的 class。

// 公共的父建構式
function CarMaker(){};

CarMaker.prototype.drive = function() {
  return 'Vroom, I have ' + this.doors + ' doors';
}

// CarMaker 的靜態方法,用來建立 car 物件
CarMaker.factory = function(type) {
  var constr = type, newcar;

  if(typeof CarMaker[constr] !== 'function') {
    throw {
      name: 'Error',
      message: constr + ' does not exist'
    }
  }

  if(typeof CarMaker[constr].prototype.drive !== 'function') {
    CarMaker[constr].prototype = new CarMaker();
  }

  newcar = new CarMaker[constr]();

  return newcar
}

// 繼承自 CarMaker,且被定義為 CarMaker 的靜態屬性
CarMaker.Compact = function() {
  this.doors = 4;
}

CarMaker.Convertible = function() {
  this.doors = 2;
}

CarMaker.SUV = function() {
  this.doors = 24;
}

var corolla = CarMaker.factory('Compact');
var soltice = CarMaker.factory('Convertible');
var cherokee = CarMaker.factory('SUV');

console.log(corolla.drive()); // Vroom, I have 4 doors
console.log(soltice.drive()); // Vroom, I have 2 doors
console.log(cherokee.drive()); // Vroom, I have 24 doors

看程式碼

說明

CarMaker 是一個公共的父建構式,因此我們將可重複使用的方法放到CarMaker.factory中。factory()是 CarMaker 的靜態方法,根據不同的 type 輸入,來建立 car 物件。建構式CarMaker.CompatcCarMaker.SUVCarMaker.Convertible,他們都繼承自 CarMaker ,且被定義為 CarMaker 的靜態屬性。

真實世界中的 Factory - Object 建構式

Object 建構式的行為也是 factory,它會根據輸入而產生不同的物件。

var o = new Object(),
    n = new Object(1),
    s = new Object('1'),
    b = new Object(true);

console.log(o.constructor === Object); // true
console.log(n.constructor === Number); // true
console.log(s.constructor === String); // true
console.log(b.constructor === Boolean); // true

推薦閱讀 / 參考文件


這篇文章的原始位置在這裡-JavaScript Design Pattern - Factory 工廠模式

由於部落格搬遷至此,因此在這裡放了一份,以便閱讀;部份文章片段也做了些許修改,以期提供更好的內容。
comments powered by Disqus