05.Javascript設計模式之原廠模式—-Factory

來源:互聯網
上載者:User

 

 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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.