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

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

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

    Never give up!

    如果說軟件開發是一條布滿荊棘的坎坷之路,那么我會每天在這道路兩旁書上“火焰舞者,到此一游!”。

     

    Builder模式的理解

          Builder模式是一步一步創建一個復雜的對象,它允許用戶可以只通過指定復雜對象的類型和內容就可以構建它們。用戶不需要知道內部的具體構建細節。因為一個復雜的對象,不但有很多大量組成部分,如汽車,有很多部件:車輪、方向盤、發動機還有各種小零件等等,部件很多,但遠不止這些,如何將這些部件裝配成一輛汽車呢?這個裝配過程也很復雜(需要很好的組裝技術),Builder模式就是為了將部件和組裝過程分開。是為了將構建復雜對象的過程和它的部件解耦。注意::是解耦過程部件
            就拿造房子來說,比如某一天你的領導找到了你,“小A啊,工作不錯,你的能力和態度都是我比較欣賞的,好好干前途一片大好”,然后你摸摸腦袋,呵呵傻笑,“我最近想蓋一棟別墅,你幫我搞定吧,有你在,我放心”,然后你屁顛屁顛跑去找了N個各個領域的師傅,砌墻的、安裝電線的、裝地板的、修馬桶的亂78遭一堆人,好了,現在可以動工了吧。但你手下的那些師傅卻是你瞧我,我瞧你的,“老板,怎么應該做成什么樣的別墅,先從哪搞起?”這時侯,你也傻了吧,忽略了最重要的一環-設計,沒辦法鍋自己也不會,去找個設計師設計兼指揮吧。設計師列出了N個方案,并選擇了其中之一就動工了。一個月后,你的上司找你要了房子交付后,這個過程也就完結了。builder模式就是這么個過程,把你的裝配過程(設計師指揮各個師傅裝配房子的順序過程)和這個builder(帶領各個專職師傅所作的事情)也就是部件職責分離。光說不練,沒用,那接下來咱就貼下代碼更加形象化下,如下:
             UML類圖:

            UML順序圖粗略如下:
              

               首先假設一個復雜對象是由多個部件組成的,Builder模式是把復雜對象的創建和部件的創建分別開來,分別用Builder類和Director類來表示。
    public interface Builder {

        
    // 比如砌墻
        public void buildPartA();
        
        
    // 比如裝電線
        public void buildPartB();
        
        
    // 比如裝馬桶
        public void buildPartC();
        
        
    //返回最后組裝成品結果 (返回最后裝配好的汽車)
        
    //成品的組裝過程不在這里進行,而是轉移到下面的Director類中進行。
        
    //從而實現了解耦【過程】和【部件】
        public Product getResult();
    }

           用Director構建最后的復雜對象,而在上面Builder接口中封裝的是如何創建一個個部件(復雜對象是由這些部件組成的),也就是說Director的內容是如何將部件最后組裝成成品:


    public class Director {

        
    private Builder builder;
        
        
    /**
         * 產品的組裝過程,這里可以改變裝配順序,從而得到不同的方案
         
    */

        
    public void build() {
            builder.buildPartA();
    // 先砌墻
            builder.buildPartB();// 再裝電線
            builder.buildPartC();// 而后裝馬桶
        }

    }


          Builder的具體實現ConcreteBuilder,通過具體完成接口Builder來構建或裝配產品的部件,定義并明確它所要創建的是什么具體東西;提供一個可以重新獲取產品的接口。
    public class ConcreteBuilder implements Builder {

        
    public void buildPartA() {
            
    // 具體如何砌墻的過程
        }


        
    public void buildPartB() {
            
    // 具體如何裝電線的過程
        }


        
    public void buildPartC() {
            
    // 具體如何裝馬桶的過程
        }


        
    public Product getResult() {
            
    // 返回最后的組裝的產品(房子)
            return new Product();
        }


    }

           復雜對象:產品Product
    public interface Product { } 

           復雜對象的部件:部件Part
    public interface Part { }

           接下去就是我們的老板來找我們要房子了:
    ConcreteBuilder builder = new ConcreteBuilder();
    Director director 
    = new Director( builder ); 

    director.build(); 
    Product product 
    = builder.getResult(); 

           整個builder模式就這樣完結了,當然有人會有疑問“為什么getResult不放在Director里?”至于這個問題我是這么想的,你的老板當然是找你要房子了,難不成還找設計師要?我們是builder嘛,那些部件(Part)可都是我們管理的,而設計師只負責設計組裝,這樣過程和部件不是職責分離的很清楚嗎?如果哪一天,老板又想造另外一棟格式不一樣的別墅,我們就直接找設計師解決下。至于builder模式和abstract factory模式的差異,我是這么理解的,builder模式注重于一個過程,而abstract factory則側重于產品的管理。

    posted on 2010-03-15 02:00 永遠的火焰舞者 閱讀(301) 評論(0)  編輯  收藏 所屬分類: designing pattern


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(1)

    隨筆分類(10)

    隨筆檔案(9)

    文章檔案(1)

    搜索

    最新評論

    • 1.?re: JForum安裝
    • 我就是想研究下sso,哈哈!再在JForum的基礎上二次開發玩玩 呵呵
    • --Jlg
    • 2.?re: JForum安裝
    • JForum的代碼還比較清晰,但談不上強大,雖然一般也足夠用了。
    • --一農

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 日韩精品视频免费在线观看| 亚洲天堂免费在线视频| 亚洲一区无码中文字幕乱码| 亚洲av日韩av天堂影片精品| 亚洲精品无码mv在线观看网站| 亚洲日本va在线视频观看| 亚洲韩国精品无码一区二区三区| 亚洲乱码中文字幕手机在线| 国产亚洲老熟女视频| 三上悠亚亚洲一区高清| 久久亚洲国产中v天仙www| 亚洲AV无码国产精品麻豆天美| 亚洲国产精品婷婷久久| 亚洲白嫩在线观看| 亚洲av无码不卡久久| 亚洲午夜福利在线视频| 亚洲国产午夜精品理论片在线播放 | 日韩精品无码一区二区三区免费| 日韩精品人妻系列无码专区免费 | 国产成人高清亚洲一区91| 人妻无码中文字幕免费视频蜜桃| 一区二区三区免费视频网站| 中文字幕的电影免费网站| 午夜视频免费在线观看| 在线观看免费人成视频色| 国产又黄又爽又刺激的免费网址 | 国产日产亚洲系列| 亚洲国产高清在线| 亚洲人成网站色在线观看| 婷婷亚洲综合五月天小说在线| 亚洲免费日韩无码系列| 香蕉免费一区二区三区| 亚洲人成网站免费播放| 成人亚洲网站www在线观看| 国产日韩亚洲大尺度高清| 亚洲国产日韩在线一区| 国产亚洲午夜精品| 午夜爽爽爽男女免费观看影院| 无码高潮少妇毛多水多水免费| 亚洲国产精品一区二区九九| 亚洲午夜精品一区二区|