posts - 262,  comments - 221,  trackbacks - 0

          一、對Builder模式解耦“過程”和“部件”的理解:

          首先以組裝汽車為例,一部汽車可以由發動機、方向盤、車輪等部件組成,而要把這些部件組裝成一部完整的汽車則需要一個復雜的過程。相同的部件在不同的汽車工廠組裝出來的就成為不一樣的汽車。這就是Builder模式的最原始需求原型

          從中我們可以看出,如果我們能夠提供這樣一種服務:客戶只需要提供給我們必要的零件,并告知我們最終要組裝成的汽車類型,由汽車裝配公司負責整個后端的裝配工作-對客戶來說是完全透明的。那么我們將可以實現“部件”和“過程”的解耦。只要我們愿意,相同的部件在我們的手里就可以變成不同的產品

          二、Builder模式的各個組成部分:

          對Builder模式組成的理解,我們可以從兩個不同的角度來看--客戶和工廠

          首先從客戶的角度來看,客戶能夠看到、感受到的只有產品和部件,從工廠的角度來看,他們感興趣的是如何生產這些零件以及如何把這些零件組裝成一個合格的產品。

          所以我們可以將Builder模式分成四個組成部分:

          ·產品:public interface Product

          ·零件:Public interface Part

          ·生產零件的過程:public interfact Builder

          ·組裝零件的過程:public class Director

          其中產品、零件都是一個接口,其下面可以有多個實現子類。我們重點關注的“生產零件的過程”和“組裝零件的過程”

          同樣類型的產品其“生產零件的過程”不盡相同,所以我們必須將其定義成一個接口,由各個零件的生產廠家去實現具體的過程。如下所示:

          public interface Builder {
            //創建部件A 比如創建汽車車輪
            
          void buildPartA();
            //創建部件B 比如創建汽車方向盤
            
          void buildPartB();
            //創建部件C 比如創建汽車發動機
            void buildPartC();

            //返回最后組裝成品結果 (返回最后裝配好的汽車)
            //成品的組裝過程不在這里進行,而是轉移到下面的Director類中進行.
            //從而實現了解耦過程和部件
            Product getResult();
          }

          public class ConcreteBuilder implements Builder {
               Part partA, partB, partC;

            public void buildPartA() {//這里是具體如何構建partA的代碼};
            public void buildPartB() {//這里是具體如何構建partB的代碼};
            public void buildPartC() {//這里是具體如何構建partB的代碼}; 

               public Product getResult() {
              //返回最后組裝成品結果
            };
          }

          OK,既然已經廠家已經知道了如何生產零件了,那么剩下來的事情就是:1). 根據客戶要求去生產這些零件 2). 組裝零件成產品

          組裝成品由Director類負責,它負責和具體的Builder類交互,告訴Builder我要生產零件,將Builder類生產好的零件組裝成成品,如下所示:

          public class Director {

            private Builder builder; 
           
               public Director( Builder builder ) {
              this.builder = builder;
            }

            
          // 將部件partA partB partC最后組成復雜對象
            
          //這里是將車輪、方向盤和發動機組裝成汽車的過程
            public void construct() {
              builder.buildPartA();
              builder.buildPartB();
              builder.buildPartC(); 
                    .....
            }
          }

          三、Builer模式的使用:

          ·創建一個Builer對象:          Builder builer = new ConcreteBuiler();
          ·創建一個Director對象:       Director director = new Director(builder);
          ·調用Director對象構建產品:director.construct();
          ·返回構建好的產品:             Product product = builder.getResult();
           



          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2008-01-02 23:01 Paul Lin 閱讀(527) 評論(0)  編輯  收藏 所屬分類: 模式與重構
          <2008年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 南通市| 松滋市| 桂阳县| 禹州市| 云浮市| 宁陕县| 肇源县| 台山市| 仪征市| 德庆县| 筠连县| 衢州市| 宝丰县| 永州市| 大渡口区| 土默特左旗| 县级市| 卓尼县| 南开区| 五家渠市| 晋宁县| 怀化市| 高唐县| 辽源市| 库尔勒市| 易门县| 蒙山县| 额尔古纳市| 图木舒克市| 平昌县| 山阴县| 株洲市| 家居| 通山县| 石嘴山市| 饶河县| 忻城县| 杂多县| 景东| 通河县| 茌平县|