工廠模式也是對象創建模式之一,它通常在類或類的靜態方法中去實現。構造對象的一種方式是使用new操作符,但使用new時正是針對實現編程,會造成“耦合”問題,與具體的類關系緊密。導致代碼更脆弱,缺乏彈性,在復雜邏輯的項目中建議是面向接口編程。
先看簡單工廠模式
Person(name, age) { var obj = {} obj.name = name obj.age = age return obj } var p1 = Person('jack', 25) var p2 = Person('lily', 22)
與構造函數方式寫一個類的區別在於沒有使用this,而是每次都構造一個空對象,然后給其添加屬性。創建對象方式不是使用new,而是使用函數調用方式。這種方式基本上用來替代一個類(具有相同屬性的對象),而復雜一些的工廠則可以造不同類型的對象。
下面以一個水果工廠示例
function Banana() { this.price = '$1.5' } function Apple() { this.price = '$1.2' } function Orange() { this.price = '$2.2' } // 靜態工廠類 function Fruit() {} Fruit.factory = function(type) { if (!window[type]) { return } var fruit = new window[type] return fruit } // 制造不同的水果 var banana = Fruit.factory('Banana') var apple = Fruit.factory('Apple') var orange = Fruit.factory('Orange')
有三個水果類Banana、Apple、Orange,一個水果工廠類Fruit,通過靜態方法factory每次可以造出不同的水果類對象。
工廠模式在JavaScript原生對象Object也有所體現,比如
var obj = Object(), num = Object(1), str = Object('s'), boo = Object(false);
Object就是一個工廠,根據參數不同會構造出不同的對象。obj是一個空對象,num是一個Number類型的對象,str是一個String類型的對象,boo是Boolean類型的對象。
jQuery 1.7中新增的$.Callbacks也是一個工廠,每次調用它都會返回一個具有add, remove, fire等方法的對象。還可以根據參數如“once”, “memory”等構造出具有不同性質的對象。