posts - 297,  comments - 1618,  trackbacks - 0

          文:阿蜜果/2011-11-8

          轉載請注明出處

          1、   什么是工廠模式?

          工廠設計模式是面向對象編程中最常用的設計模式之一。它又被稱為創建性模式,因為它被用來創建其他類。在應用程序預見不到自己要創建的對象類型時,就會使用工廠解決方案。在這些情況下,可以使用工廠模式作為創建對象的基礎,不需要確切地了解將要創建哪些對象。

          根據工廠模式實現的類可根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類并且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。

          首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然后需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例后,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。

          工廠模式的示意圖如下所示:
             

          在上面的圖形中,Client需要的Product對象不再通過new Product(…)來生成,而是通過工廠類Factory類的creates方法來獲取,工廠類一般提供多種有相關關系的對象的生成,用于解除Client類對Product類的直接耦合關系。

          2、   工廠模式的應用場合

          工廠模式常見的應用場合如下:

          1)動態實現:例如在玩“極品飛車”這款游戲時,游戲者可以根據不同品牌選擇賽車,而這個“品牌”其實就是工廠,每個工廠生產的賽車都不一樣,這就是典型的工廠方法的應用場景。可以創建一些用不同方式實現同一接口的對象,那么可以使用一個工廠方法或簡單工廠對象來簡化選擇所采用的實現的過程。

          2)節省設置開銷:如果對象需要進行復雜而且彼此相關的設置,那么使用工廠模式可以減少減少每種對象所需的代碼量。如果這種設置只需要為特性類型的所有實例執行一次即可,這種作用尤其突出。把這種設置代碼放在類的構造器函數中并不是一種高效的做法。這是因為即便設置工作已經完成,每次創建新實例的時候這些代碼還是會執行,而且這樣做會把設置代碼分散在不同的類中。

          3)用許多小型對象組成一個大對象:工廠方法用來創建封裝了許多較小對象的對象。例如自行車包含了許多更小的子系統:車輪、車架、傳動部件以及車閘等。如果不想讓某個子系統與較大的對象之間形成強耦合,而是想在運行時從許多子系統中進行挑選的話,那么工廠模式是一個很好的選擇。

          3、   JavaScript中使用工廠模式

          JavaScript中,單例(Singleton)模式是最基本又最有用的模式之一。這種模式提供了一種將代碼組織為一個邏輯單元的手段,這個邏輯單元中的代碼可以通過單一的變量進行訪問。確保單例對象只有一份實例,你就可以確信自己的所有代碼使用的都是同樣的全局資源。

          單例類在JavaScript中用途廣泛:

          1)可以用來劃分命名空間,以減少網頁中全局變量的數量;

          2)可以在一種名為分支的技術中用來封裝瀏覽器之間的差異;

          3)可以借助于單例模式,將代碼組織得更為一致,從而使代碼更容易閱讀和維護。

          3.1 簡單工廠

          假設你想開一個自行車商店,每個店都有幾個型號的自行車出售。

          首先創建一個BicycleFactory類,該類的createBicycle用于根據傳入的不同的類型時創建不同的自行車對象,該類的代碼如下:

          BicycleFactory.prototype = {
              createBicycle: 
          function(model) {
                  
          var bicycle;

                  
          switch(model) {
                      
          case 'Speedster':
                          bicycle 
          = new Speedster();
                          
          break;
                      
          case 'Lowrider':
                          bicycle 
          = new Lowrider();
                          
          break;
                      
          case 'ComfortCruiser':
                      
          default:
                          bicycle 
          = new ComfortCruiser();
                  }

                  
          // 調用公用方法確保bicycle對象實現了Bicycle接口
                  Interface.ensureImplements(bicycle, Bicycle);
                  
          return bicycle;
              }

          }
          ;

             在如上代碼中,createBicycle方法根據所要求自行車型號用switch創建一個自行車的實例,各種型號的自行車實例可以互換使用,因為都實現了Bicycle接口。

          Bicycle接口的定義如下所示(包括assemblewashriderepair四個方法):

          var Bicycle = new Interface(‘Bicycle’, ‘assemble’, ‘wash’, ‘ride’, ‘repair’);

          下面示意一下實現了Bicycle接口的Speedster

          var Speedster = function() // 實現Bicycle接口
              
          }
          ;

          Speedster.prototype 
          = {
              assemble: 
          function() {
                  
              }
          ,
              wash: 
          function() {
                  
              }
          ,
              ride: 
          function() {
                  
              }
          ,
              repair: 
          function() {
                  
              }

          }
          ;

          接著創建一個自行車商店類,該類包含一個sellBicycle(銷售自行車)的方法,該方法首先通過工廠類的createBicycle方法獲得一輛自行車,接著對自行車進行組裝和清洗:

          var BicycleShop = function() {};
          BicycleShop.prototype 
          = {
              sellBicycle: 
          function(model) {
                  
          var bicycle = BicycleFactory.createBicycle(model);
                  
          // 進行自行車的組床和清洗
                  bicycle.assemble();
                  bicycle.wash();
                  
          return bicycle;
              }

          }
          ;

          若要出售一輛Speedster類型的自行車,參考代碼如下:

          var shop = new BicycleShop();
          var speedsterBike = shop.sellBicycle('Speedster');

          BicycleFactory就是簡單工廠的一個很好的實例。這種模式把成員對象的創建工作轉交給一個外部對象。如果負責創建實例的方法的邏輯不會發生變化,那么一般說來使用單例或靜態方法創建這些成員實例都是合理的,但如果需要提供幾種不同品牌的自行車,那么更恰當的做法是把這些創建方法實現在一個類中,并從該類派生出一個子類。

          3.2 抽象工廠模式

                   待寫。

          4、   工廠模式的優缺點

          JavaScript中使用工廠模式的主要優點如下:

          1)弱化對象間的耦合;

          2)通過工廠方法而不是new關鍵字及具體類,可以把所有實例化代碼集中在一個位置,這可以大大簡化更換所用的類或運行期間動態選擇所用的類的工作;

          3)防止代碼的重復:在一個類中進行類的實例化,可以消除重復性的代碼。

          不適合使用的場合為:

          如果根本不可能另外換用一個類,或者不需要在運行期間在一系列可互換的類中進行選擇,那么不應該使用工廠方法,使用構造函數進行公開的實例化即可,因為這可以一眼看出調用的是什么構造函數,而不必去查看某個工廠方法以便知道實例化的是什么類。

          5、   參考文檔

          1)《JavaScript設計模式》 Ross HarmesDustin Dial著,謝廷晟 譯,人民郵電出版社出版

          2)《工廠模式_百度百科》:

          http://baike.baidu.com/view/1306799.htm

          3)《工廠模式UML圖》:

          http://apps.hi.baidu.com/share/detail/31694688

           

           

           

          posted on 2011-11-08 16:23 阿蜜果 閱讀(2800) 評論(2)  編輯  收藏 所屬分類: JavascriptDesign Pattern


          FeedBack:
          # re: 蜜果私塾:在JavaScript中使用工廠模式
          2011-11-10 08:10 | tb
          不錯 啊   回復  更多評論
            
          # re: 蜜果私塾:在JavaScript中使用工廠模式
          2011-11-10 14:46 | tb
          確實不錯  回復  更多評論
            
          <2011年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296569
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 河间市| 伊春市| 鄂温| 修武县| 新营市| 侯马市| 崇文区| 景德镇市| 汕头市| 北辰区| 缙云县| 斗六市| 杭州市| 博兴县| 弥渡县| 北辰区| 临漳县| 城市| 治多县| 深州市| 肃北| 商南县| 祁连县| 修文县| 什邡市| 邳州市| 富锦市| 司法| 钟祥市| 昌图县| 古交市| 南郑县| 常熟市| 德江县| 沭阳县| 临夏县| 东乡县| 湛江市| 西宁市| 阿坝| 衡阳市|