簡單工廠模式是由一個方法來決定到底要創建哪個類的實例, 而這些實例經常都擁有相同的接口. 這種模式主要用在所實例化的類型在編譯期並不能確定, 而是在執行期決定的情況。 說的通俗點,就像公司茶水間的飲料機,要咖啡還是牛奶取決於你按哪個按鈕。
e.g.
var BicycleShop = function(){};
BicycleShop.prototype = {
sellBicycle : 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 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