<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)載請(qǐng)注明出處

    1、   什么是工廠(chǎng)模式?

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

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

    首先需要定義一個(gè)基類(lèi),該類(lèi)的子類(lèi)通過(guò)不同的方法實(shí)現(xiàn)了基類(lèi)中的方法。然后需要定義一個(gè)工廠(chǎng)類(lèi),工廠(chǎng)類(lèi)可以根據(jù)條件生成不同的子類(lèi)實(shí)例。當(dāng)?shù)玫阶宇?lèi)的實(shí)例后,開(kāi)發(fā)人員可以調(diào)用基類(lèi)中的方法而不必考慮到底返回的是哪一個(gè)子類(lèi)的實(shí)例。

    工廠(chǎng)模式的示意圖如下所示:
       

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

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

    工廠(chǎng)模式常見(jiàn)的應(yīng)用場(chǎng)合如下:

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

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

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

    3、   JavaScript中使用工廠(chǎng)模式

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

    單例類(lèi)在JavaScript中用途廣泛:

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

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

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

    3.1 簡(jiǎn)單工廠(chǎng)

    假設(shè)你想開(kāi)一個(gè)自行車(chē)商店,每個(gè)店都有幾個(gè)型號(hào)的自行車(chē)出售。

    首先創(chuàng)建一個(gè)BicycleFactory類(lèi),該類(lèi)的createBicycle用于根據(jù)傳入的不同的類(lèi)型時(shí)創(chuàng)建不同的自行車(chē)對(duì)象,該類(lèi)的代碼如下:

    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對(duì)象實(shí)現(xiàn)了Bicycle接口
            Interface.ensureImplements(bicycle, Bicycle);
            
    return bicycle;
        }

    }
    ;

       在如上代碼中,createBicycle方法根據(jù)所要求自行車(chē)型號(hào)用switch創(chuàng)建一個(gè)自行車(chē)的實(shí)例,各種型號(hào)的自行車(chē)實(shí)例可以互換使用,因?yàn)槎紝?shí)現(xiàn)了Bicycle接口。

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

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

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

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

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

    }
    ;

    接著創(chuàng)建一個(gè)自行車(chē)商店類(lèi),該類(lèi)包含一個(gè)sellBicycle(銷(xiāo)售自行車(chē))的方法,該方法首先通過(guò)工廠(chǎng)類(lèi)的createBicycle方法獲得一輛自行車(chē),接著對(duì)自行車(chē)進(jìn)行組裝和清洗:

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

    }
    ;

    若要出售一輛Speedster類(lèi)型的自行車(chē),參考代碼如下:

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

    BicycleFactory就是簡(jiǎn)單工廠(chǎng)的一個(gè)很好的實(shí)例。這種模式把成員對(duì)象的創(chuàng)建工作轉(zhuǎn)交給一個(gè)外部對(duì)象。如果負(fù)責(zé)創(chuàng)建實(shí)例的方法的邏輯不會(huì)發(fā)生變化,那么一般說(shuō)來(lái)使用單例或靜態(tài)方法創(chuàng)建這些成員實(shí)例都是合理的,但如果需要提供幾種不同品牌的自行車(chē),那么更恰當(dāng)?shù)淖龇ㄊ前堰@些創(chuàng)建方法實(shí)現(xiàn)在一個(gè)類(lèi)中,并從該類(lèi)派生出一個(gè)子類(lèi)。

    3.2 抽象工廠(chǎng)模式

             待寫(xiě)。

    4、   工廠(chǎng)模式的優(yōu)缺點(diǎn)

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

    1)弱化對(duì)象間的耦合;

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

    3)防止代碼的重復(fù):在一個(gè)類(lèi)中進(jìn)行類(lèi)的實(shí)例化,可以消除重復(fù)性的代碼。

    不適合使用的場(chǎng)合為:

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

    5、   參考文檔

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

    2)《工廠(chǎng)模式_百度百科》:

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

    3)《工廠(chǎng)模式UML圖》:

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

     

     

     

    posted on 2011-11-08 16:23 阿蜜果 閱讀(2802) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): JavascriptDesign Pattern


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

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

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

    留言簿(263)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    相冊(cè)

    關(guān)注blog

    積分與排名

    • 積分 - 2298212
    • 排名 - 3

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 永久黄色免费网站| 国产成人无码免费视频97 | 中文字幕亚洲一区二区三区| 国产国产人免费视频成69大陆| 亚洲男女性高爱潮网站| 中文字幕在线观看亚洲日韩| 亚洲成AV人片在WWW| 无码人妻一区二区三区免费视频 | 亚洲精品国产suv一区88| 无码中文在线二区免费| 内射无码专区久久亚洲| 久久精品夜色国产亚洲av| 亚洲一线产品二线产品| 国产免费拔擦拔擦8X高清在线人| 亚洲国产精品免费在线观看| 国产成人无码免费看视频软件 | 亚洲成AV人片一区二区| 久久精品国产亚洲av品善| 免费国产99久久久香蕉| 久久久久亚洲AV无码永不| 99亚洲乱人伦aⅴ精品| 免费在线观看黄网| 亚洲欧洲无码一区二区三区| 在线看片v免费观看视频777| 国产∨亚洲V天堂无码久久久| 久9这里精品免费视频| 俄罗斯极品美女毛片免费播放| 羞羞视频免费观看| 成人免费网站在线观看| 亚洲成色在线综合网站| 久久国产精品成人片免费| 国产成A人亚洲精V品无码| 99热在线观看免费| 亚洲电影一区二区三区| 中文无码日韩欧免费视频| 成人性生免费视频| 中文字幕手机在线免费看电影 | 国产一级淫片免费播放| 亚洲日韩精品无码AV海量| 久久久久国产成人精品亚洲午夜| 2021在线永久免费视频|