05.Javascript設計模式之工廠模式----Factory

 

 05.Javascript設計模式之工廠模式----Factory

前面章節介紹了簡單工廠的設計模式,而在設計模式中,還有一個更重要的,就是工廠模式。

真正的工廠模式與簡單工廠模式的區別在於,它不像前面簡單工廠的例子中那樣,不是另外有使用一個類或對象來創建自行車,而是使用一個子類。

工廠模式的正式定義爲:工廠是一個將其成員對象的實例化推遲到子類中進行的類。

工廠的定義

爲了和簡單工廠形成對比,這裏還是採用BicycleShop爲例來說明工廠模式的設計理念。

我們打算讓各個自行車商店自行決定從哪個生產廠家進貨。鑑於此,單靠一個自行車工廠(BicycleFactory)是無法提供需要的所有的自行車的。 所以我們考慮將BicycleShop設計爲一個抽象類,讓子類根據各自的進貨渠道實現其進貨自行車(createBicycle)的工作:

var BicycleShop = function(){};
BicycleShop.prototype = {
    sellBicycle : function(model){
        //讓其子類來完成這個工作
        var bicycle = this.createBicycle(model);

        //下面的代碼仍然沒有變
        //自行車組裝
        bicycle.assemble();
        //自行車清洗
        bicycle.wash();

        return bicycle;
    },

    //抽象方法,必須實現後才能調用
    createBicycle : function(model){
        throw new Error("必須通過子類的實例才能調用此方法,進貨自行車");
    }
};

BicycleShop類中定義了一個createBicycle方法,該方法一旦調用就會拋出異常,因此,該類是不能直接實例化的,該抽象類必須被繼承,通過其子類來完成createBicycle的工作,

工廠模式實現

下面定義了兩個子類,一個子類代表從Oracle公司進貨的商店,一個子類代表從IBM公司進貨的商店,代碼如下:

//Oracle自行車商店
var OracleBicycleShop = function(){};
//繼承父類
inherits(OracleBicycleShop,BicycleShop);
//實現createBicycle方法
OracleBicycleShop.prototype.createBicycle = function(model){
    var bicycle;
    //生產自行車
    switch(model){
        case "speedster":
            bicycle = new OracleSpeedster();
            break;
        case "lowrider":
            bicycle = new OracleLowrider();
            break;
        case "Alien":   
            bicycle = new OracleAlien();
            break;
        case "comfort cruiser":
        default :
            bicycle = new OracleComfortCruiser();
    }
    return bicycle;
};

//IBM自行車商店
var IBMBicycleShop = function(){};
//繼承父類
inherits(IBMBicycleShop,BicycleShop);
//實現createBicycle方法
IBMBicycleShop.prototype.createBicycle = function(model){
    var bicycle;
    //生產自行車
    switch(model){
        case "speedster":
            bicycle = new IBMSpeedster();
            break;
        case "lowrider":
            bicycle = new IBMLowrider();
            break;
        case "Alien":   
            bicycle = new IBMleAlien();
            break;
        case "comfort cruiser":
        default :
            bicycle = new IBMComfortCruiser();
    }
    return bicycle;
};

經過這樣的一個設計,就產生了專賣店的概念,OracleBicycleShop表示Oracle自行車專賣店,IBMBicycleShop則表示IBM自行車專賣店。現在,如果用戶 需要購買Speedster牌的自行車,無論跑到那個專賣店,都可以買到了,示例代碼如下:

//到Oracle專賣店購買
var oracle = new OracleBicycleShop();
var yourNewBicycle = oracle.createBicycle("speedster");

//到IBM專賣店購買
var ibm = new IBMBicycleShop();
var myNewBicycle = ibm.createBicycle("speedster");

即便是要增加對其他生產廠家的支持,也是很簡單的,只需要再創建一個BicycleShop的子類並實現其createBicycle方法即可。

根據不同的需求,對各個子類進行修改,以支持更多廠家其他型號的產品,這是工程設計模式最重要的特點。

代碼有不正確的地方,請您指正,thanks

 

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