<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的代碼還比較清晰,但談不上強大,雖然一般也足夠用了。
    • --一農

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 99久9在线|免费| 精品久久久久久国产免费了| 国产99视频精品免费专区| 国产成人综合亚洲AV第一页| 黄页网址在线免费观看| 亚洲国产精品一区二区第四页| 国产亚洲美女精品久久| 亚洲成?v人片天堂网无码| selaoban在线视频免费精品| 亚洲熟女少妇一区二区| 免费国产成人午夜在线观看| 亚洲AV无码久久精品狠狠爱浪潮 | 少妇性饥渴无码A区免费| 亚洲婷婷五月综合狠狠爱| 精品国产免费一区二区三区香蕉| 亚洲av无码乱码国产精品| 免费成人激情视频| 亚洲人成网站在线在线观看| 国产又大又长又粗又硬的免费视频| 亚洲AⅤ男人的天堂在线观看 | 亚洲毛片免费视频| 亚洲一级毛片免费看| 国产精品深夜福利免费观看| 人碰人碰人成人免费视频| 亚洲国产精品无码久久一线 | 国产成人免费福利网站| 一级毛片大全免费播放下载| 久久亚洲精品AB无码播放| 91香蕉视频免费| 污污污视频在线免费观看| 亚洲日本一区二区三区| 破了亲妺妺的处免费视频国产| 成人av片无码免费天天看| 亚洲福利电影一区二区?| 国产成人无码区免费A∨视频网站 国产成人涩涩涩视频在线观看免费 | 久久精品国产免费观看| 国产精品日本亚洲777| 国产精品亚洲片在线| 精品久久久久久久免费加勒比| 免费h视频在线观看| 亚洲成av人无码亚洲成av人|