對象或類內部每每會包含別的對象,在建立成員對象時你可能習慣於使用使用傳統的new來建立對象。可是這種方式會形成兩個對象之間的依賴。設計模式
工廠模式就是一種有助於消除或減弱這種依賴的設計模式。ide
書中用自行車商店的例子闡述了簡單工廠模式。先是用傳統的方式,在 BicycleShop 類內部用new來建立各類自行車。而後說了這種方式的弊端,當狀況發生變化時,如要填一個自行車種類,這時候就須要修改 BicycleShop 的代碼,哪怕是這個類實際功能沒有發生改變。更好的方法是把建立各類自行車的部分轉交給一個簡單工廠對象—— BicycleFactory ,在 BicycleFactory 內new各類自行車,BicycleShop 經過 BicycleFactory 得到自行車對象,而後進行組裝、清洗等操做。用於有關自行車建立的的信息都集中在 BicycleFactory 內管理,因此修改起來也很方便。BicycleFactory 就是一個簡單工廠對象,這種模式把成員對象的建立交給一個外部工廠對象。函數
真正的工廠模式與簡單工廠模式的區別在於,它不是使用一個對象或類來建立自行車,而是使用一個子類。按照正式定義,工廠是一個將其成員對象的實例化推遲到子類中進行的類。this
例子仍是自行車商店,此次自行車商店從超市變成了專賣店。BicycleShop 設計成了抽象類,各品牌商店爲 BicycleShop 的子類。代碼以下prototype
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("Unsupported operation on an abstract class."); } } /*AcmeBicycleShop class*/ var AcmeBicycleShop = function () {}; extend(AcmeBicycleShop, BicycleShop); AcmeBicycleShop.prototype.createBicycle = function (model) { var bicycle; switch(model) { case "The SpeedSter": bicycle = new AcmeSpeedster(); break; case "The Lowrider": bicycle = new AcemLowrider(); break; } Interface.ensureImplements(bicycle, Bicycle); return bicycle; }
這樣設計的好處是,增長對其餘廠家的支持很簡單。只要在建立一個 BicycleShop 的子類便可,咱們也能夠對各個子類進行修改。這是工廠模式最重要的特色,對Bicycle 進行通常性操做的代碼能夠所有寫在父類 BicycleShop 中,而對具體的Bicycle對象實例化的工做推遲到了各個子類中。設計
工廠模式適用場景對象
一、動態實現。建立一些用不一樣方式實現了同一藉口的對象。it
二、節省設置開銷。若是對象須要進行復雜且彼此相關的設置,那麼使用工廠模式能夠減小每種對象的代碼量。若是這種設置只須要爲特定類型的全部實例執行一次便可,這種做用尤爲突出。把這種設置代碼放在構造函數中並非一種高效的作法,這是由於即便設置工做已經完成,每次建立新實例的時候這些代碼仍是會執行,並且這樣會把設置代碼分散到不一樣的類中。工廠方法很是適合這種場合。它能夠在實例化全部對象以前先一次性地進行設置。不管多少不一樣的類會被實例化,這種方法均可以讓設置代碼集中到一個地方。io
三、用許多小型對象組裝成一個大對象。function