抽象工廠模式:通過對類的工廠抽象使其業務用於對產品類簇的創建,而不負責創建某一類產品的實例。
抽象類
//測試抽象類,使用其實例方法時會拋出錯誤
var test = function(){};
test.prototype = {
getFirst:function(){
return new Error('抽象方法不可調用');
},
getSecond:function(){
return new Error('抽象方法不可調用!');
}
};
在上面的代碼中,test類什麼都不能做,創建時沒有任何屬性,原型上的方法也不能使用。但是在繼承上是很有用的,因爲定義了一種類,並定義了其方法,如果在子類中重寫其方法,就不會出現報錯。
但是如果必要的方法從父類中繼承過來而沒有去具體去重寫實現,那麼實例化對象會調用父類中的方法。如果父類中有提示的話,是非常有幫助的。這就是抽象類的作用所在。
抽象工廠模式
var myTest = function(subType,superType){
//判斷抽象工廠中是否有該抽象類
if(typeof myTest[superType] === 'function'){
//緩存類
function F(){};
//繼承父類的方法和屬性
F.prototype = new myTest[superType]();
//將子類constructor指向子類
subType.constructor = subType;
//子類原型繼承“父類”
subType.prototype = new F();
}else{
//不存在該抽象類拋出錯誤
throw new Error("未創建抽象類!!!");
}
}
myTest.first = function(){
this.type = 'first';
};
myTest.first.prototype = {
getFirst:function(){
return new Error('抽象方法不可調用');
},
getSecond:function(){
return new Error('抽象方法不可調用!');
}
};
myTest.second = function(){
this.type = 'second';
};
myTest.second.prototype = {
getFirst:function(){
return new Error('抽象方法不可調用');
},
getSecond:function(){
return new Error('抽象方法不可調用!');
}
};
抽象工廠其實是一個實現子類繼承父類的方法,在這個方法中要通過傳遞子類以及要繼承父類(抽象類)的名稱,並在抽象工廠方法中又增加了一次對抽象類存在性的一次判斷,如果存在,就會繼承父類的方法。
注意:在對過渡類的原型繼承時,不是繼承父類的原型,而是通過new關鍵字複製父類的一個實例。因爲不僅僅要繼承父類的原型方法,更要繼承父類的對象屬性。
實現
一個測試用例,展示繼承的使用
//第一個測試子類
var firstTest = function(firstParameter,secondParameter){
this.firstParameter = firstParameter;
this.secondParameter = secondParameter;
};
//抽象工廠實現對test抽象類的繼承
myTest(firstTest,'test');
firstTest.prototype.getFirst = function(){
return this.firstParameter;
}
firstTest.prototype.getSecond = function(){
return this.secondParameter;
}
總結
抽象工廠模式是設計模式中最抽象的一個,也是唯一一種抽象化創建模式。創建出來的不是一個真正的對象實例,而是一個類簇,它制定了類的結構,區別於簡單工廠模式創建單一對象,工廠方法模式創建多類對象。由於Javascript不支持抽象化創建與虛擬方法,應用不太廣泛。