<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 297,  comments - 1618,  trackbacks - 0

    文:阿蜜果/2011-11-8

    轉(zhuǎn)載請注明出處

    1、   什么是工廠模式?

    工廠設(shè)計模式是面向?qū)ο缶幊讨凶畛S玫脑O(shè)計模式之一。它又被稱為創(chuàng)建性模式,因為它被用來創(chuàng)建其他類。在應(yīng)用程序預(yù)見不到自己要創(chuàng)建的對象類型時,就會使用工廠解決方案。在這些情況下,可以使用工廠模式作為創(chuàng)建對象的基礎(chǔ),不需要確切地了解將要創(chuàng)建哪些對象。

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

    首先需要定義一個基類,該類的子類通過不同的方法實現(xiàn)了基類中的方法。然后需要定義一個工廠類,工廠類可以根據(jù)條件生成不同的子類實例。當?shù)玫阶宇惖膶嵗螅_發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是哪一個子類的實例。

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

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

    2、   工廠模式的應(yīng)用場合

    工廠模式常見的應(yīng)用場合如下:

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

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

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

    3、   JavaScript中使用工廠模式

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

    單例類在JavaScript中用途廣泛:

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

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

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

    3.1 簡單工廠

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

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

    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();
            }

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

    }
    ;

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

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

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

    下面示意一下實現(xiàn)了Bicycle接口的Speedster

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

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

    }
    ;

    接著創(chuàng)建一個自行車商店類,該類包含一個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就是簡單工廠的一個很好的實例。這種模式把成員對象的創(chuàng)建工作轉(zhuǎn)交給一個外部對象。如果負責(zé)創(chuàng)建實例的方法的邏輯不會發(fā)生變化,那么一般說來使用單例或靜態(tài)方法創(chuàng)建這些成員實例都是合理的,但如果需要提供幾種不同品牌的自行車,那么更恰當?shù)淖龇ㄊ前堰@些創(chuàng)建方法實現(xiàn)在一個類中,并從該類派生出一個子類。

    3.2 抽象工廠模式

             待寫。

    4、   工廠模式的優(yōu)缺點

    JavaScript中使用工廠模式的主要優(yōu)點如下:

    1)弱化對象間的耦合;

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

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

    不適合使用的場合為:

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

    5、   參考文檔

    1)《JavaScript設(shè)計模式》 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 阿蜜果 閱讀(2791) 評論(2)  編輯  收藏 所屬分類: JavascriptDesign Pattern


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

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

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

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關(guān)注blog

    積分與排名

    • 積分 - 2294805
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产成人精品青青草原| 三上悠亚电影全集免费 | 高清免费久久午夜精品| 日本在线免费观看| 国产精品jizz在线观看免费| 亚洲AV无码一区二区三区DV| 国产亚洲漂亮白嫩美女在线| 国产成人免费高清激情明星| 在线观看亚洲精品国产| 亚洲日产乱码一二三区别| 日韩在线不卡免费视频一区| 亚洲人成色7777在线观看不卡| 亚洲一卡2卡4卡5卡6卡残暴在线| 中国精品一级毛片免费播放| 亚洲Av永久无码精品三区在线| 无码国产精品一区二区免费vr| 不卡精品国产_亚洲人成在线| 亚洲欧美成人综合久久久| 日本人的色道www免费一区| 亚洲另类自拍丝袜第1页| 成年18网站免费视频网站| 亚洲精品视频免费看| 日本一道本不卡免费| 亚洲成a人不卡在线观看| 98精品全国免费观看视频| 精品亚洲AV无码一区二区| 国产免费人视频在线观看免费| 91在线亚洲综合在线| 免费精品国产自产拍在线观看图片 | 成年女人喷潮毛片免费播放 | a级毛片高清免费视频| 国产成人精品日本亚洲专区 | 久久精品国产影库免费看| 在线观看亚洲av每日更新| 99精品一区二区免费视频| 伊人久久五月丁香综合中文亚洲| 美女视频黄a视频全免费| 欧美亚洲国产SUV| 国产一级淫片免费播放| 在线免费视频你懂的| 久久亚洲国产中v天仙www|