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 永遠的火焰舞者 閱讀(302) 評論(0)  編輯  收藏 所屬分類: designing pattern


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


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆分類(10)

          隨筆檔案(9)

          文章檔案(1)

          搜索

          最新評論

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

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平顶山市| 永新县| 安丘市| 隆德县| 宝应县| 余江县| 阿巴嘎旗| 曲沃县| 灌阳县| 修水县| 江孜县| 临夏县| 邵阳市| 静安区| 资兴市| 浦县| 清涧县| 兰坪| 自治县| 桑日县| 靖宇县| 富锦市| 闵行区| 通化县| 和林格尔县| 开原市| 三江| 离岛区| 都江堰市| 五华县| 正阳县| 鄱阳县| 馆陶县| 泾源县| 新蔡县| 内丘县| 沂源县| 旺苍县| 体育| 锡林郭勒盟| 惠东县|