所謂的工廠模式,顧名思義就是成批量地生產模式。它的核心作用也是和現實中的工廠一樣利用重複的程式碼最大化地產生效益。在javascript中,它常常用來生產許許多多相同的例項物件,在程式碼上做到最大的利用。
工廠模式定義建立物件的介面,但是讓子類決定例項化哪個類。工廠方法將類的例項化延遲到子類
首先是建立建構函式,區別物種的不同屬性。
//定義人的建構函式
var man = function(o) {
this.foots = o.foot || 2;
this.legs = o.legs || 2;
}
//定義魚的建構函式
var fish = function(o) {
this.qi = o.qi || 4;
this.foots = o.foots || 9;
}
//定義外星人的建構函式
var et = function(o) {
this.legs = o.legs ||10;
this.eyes = o.eyes || 6;
}
複製程式碼
接下來我們再建立一個工廠的建構函式:
//工廠函式的建構函式
var F = function() {}
複製程式碼
接著在原型上設定它的預設方法:
//f的預設輸出例項函式;
F.prototype.vehicleClass = man;
複製程式碼
此時,該工廠函式預設生產的是man的例項,在不配置的情況下我們產生的是人類的例項,然後我們對vehicleClass這個函式進行擴充,生成一個新的函式,此函式可以對不同的類別進行甄別,
//類的甄別函式
F.prototype.vehicleCreate = function(o) {
switch(o.vehicleType) {
case 'man' :
this.vehicleClass = man;
break;
case 'fish' :
this.vehicleClass = fish;
break;
case 'et' :
this.vehicleClass = et;
break;
}
//返回例項
return this.vehicleClass(o);
}
複製程式碼
通過swith語句的索引,可以通過vehicleType
進行不同類的例項化。那麼我們看看這個類是如何工作的。首先時例項工廠類.
var Factory = new F();
複製程式碼
然後呼叫vehicleCreate
方法,通過傳參獲取不同例項的物件。
var Man = Factory.vehicleCreate({
vehicleType : 'man',
legs : 2,
foots : 2
});
複製程式碼
這樣,通過vehicleType
的值,我們可以告訴工廠類我們希望輸出的物種,然後通過其他的屬性,我們可以控制該物種例項的各種基礎屬性。
工廠模式適用於以下場景:
- 例項物件較複雜。
- 多物件的簡單,快速的實現。
- 跟享元模類似,適用於擁有共同屬性的物件。
- 只需要滿足一個API契約的其他物件的例項物件。
工廠模式實現起來較為簡單,不僅僅是工廠模式,幾乎所有模式的程式碼看起來都比較簡單。設計模式其實就是把經常用到的程式碼歸納總結系統的表達而已。在之後的應用中,我們可以系統地去想到這些模式並且運用它們。設計模式更代表的是一種系統思想,而不是重複的程式碼堆砌。