簡單工廠模式是由一個方法來決定到底要建立哪一個類的實例, 而這些實例常常都擁有相同的接口. 這種模式主要用在所實例化的類型在編譯期並不能肯定, 而是在執行期決定的狀況。 說的通俗點,就像公司茶水間的飲料機,要咖啡仍是牛奶取決於你按哪一個按鈕。javascript
e.g.html
var BicycleShop = function(){};java
BicycleShop.prototype = {ide
sellBicycle : function( model ){函數
var bicycle;ui
switch( model ){spa
case "The Speedster":.net
bicycle = new Speedster();prototype
break;unix
case "The Lowrider":
bicycle = new Lowrider();
break;
case "The Cruiser":
default:
bicycle = new Cruiser();
break;
}
return bicycle;
}
}
sellBicycle 方法根據所提供的自行車型號來進行自行車的實例建立。那麼對於一家ABC店鋪,須要Speedster車型我只須要
var ABC = new BicycleShop();
var myBike = ABC.sellBicycle("The Speedster");
以上方式很管用,可是一旦說我須要添加一些自行車款式的時候我就必須修改 BicycleShop 的 switch 部分,那麼只要是修改就有可能帶來BUG。因此,將這部分生成實例的代碼單獨的提出來分工交給一個簡單的工廠對象是一個很不錯的方法。
var BicycleFactory = { createBicycle : function( model ){ var bicycle; switch( model ){ case "The Speedster": bicycle = new Speedster(); break; case "The Lowrider": bicycle = new Lowrider(); break; case "The Cruiser": default: bicycle = new Cruiser(); break; } return bycicle; } }
BicycleFactory 是一個脫離於BicycleShop的單體。下降耦合度的效果顯而易見。當須要添加新的類型的時候,不須要動 BicycleShop 只需修改工廠單體對象就能夠。
var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ var bicycle = BicycleFactory.createBicycle(model); return bicycle; } }
工廠模式定義一個用於建立對象的接口,這個接口由子類決定實例化哪個類。該模式使一個類的實例化延遲到了子類。而子類能夠重寫接口方法以便建立的時候指定本身的對象類型。
var productManager = {}; productManager.createProductA = function () { console.log('ProductA'); } productManager.createProductB = function () { console.log('ProductB'); } productManager.factory = function (typeType) { return new productManager[typeType]; } productManager.factory("createProductA");
何時使用工廠模式
如下幾種情景下工廠模式特別有用:
以上就是一個很好的 簡單工廠模式 的實例。該模式將成員對象的建立工做交給一個外部對象實現,該外部對象能夠是一個簡單的命名空間,也能夠是一個類的實例。
工廠模式之利
主要好處就是能夠消除對象間的耦合,經過使用工程方法而不是new關鍵字。將全部實例化的代碼集中在一個位子防止代碼重複。
工廠模式之弊
大多數類最好使用new關鍵字和構造函數,可讓代碼更加簡單易讀。而沒必要去查看工廠方法來知道。
轉自:http://blog.chinaunix.net/uid-26672038-id-4011524.html
http://www.cnblogs.com/TomXu/archive/2012/02/23/2353389.html