Javascript設計模式(三)-- 抽象工廠模式

抽象工廠模式:通過對類的工廠抽象使其業務用於對產品類簇的創建,而不負責創建某一類產品的實例

抽象類

//測試抽象類,使用其實例方法時會拋出錯誤
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不支持抽象化創建與虛擬方法,應用不太廣泛。

 

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