它的領域中同其它模式的不同之處在於它並沒有明確要求我們使用一個構造器。取而代之,一個工廠能提供一個創建對象的公共接口,我們可以在其中指定我們希望被創建的工廠對象的類型。
- 簡單工廠模式:使用一個類(通常為單體)來生成實例
- 復雜工廠模式:使用子類來決定一個變量成員應該為哪個具體的類的實例.
簡單工廠模式
var BicycleShop = function () { }; BicycleShop.prototype = { sellBicycle: function (model) { var bicycle; switch (model) { case "A"://A類型的自行車 bicycle = new A(); break; case "B": bicycle = new B(); break; case "C": bicycle = new C(); break; } return bicycle; } }
以上方式很管用,但是如果需要添加一些自行車款式的時候,比如我想能生產D類型的自行車,這就需要修改BicycleShop的switch部分,這樣就不太好了。
復雜工廠模式
為了和簡單工廠形成對比,這里還是采用BicycleShop為例來說明工廠模式的設計理念。
我們打算讓各個自行車商店自行決定從哪個生產廠家進貨。鑒於此,單靠一個自行車工廠(BicycleFactory)是無法提供需要的所有的自行車的。 所以我們考慮將BicycleShop設計為一個抽象類,讓子類根據各自的進貨渠道實現其進貨自行車(createBicycle)的工作:
var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function(model){ //讓其子類來完成這個工作 var bicycle = this.createBicycle(model); 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方法即可。
根據不同的需求,對各個子類進行修改,以支持更多廠家其他型號的產品,這是工程設計模式最重要的特點。