1.現(xiàn)實問題
          面向?qū)ο缶幊炭偸呛同F(xiàn)實問題的解決思想一致的。


          汽車是如何產(chǎn)生的?這個問題在學(xué)習(xí)工廠模式中已經(jīng)舉過例子。我再重新分析一下,看看有何不同。

          Factory模式中:
          1.有一個抽象的工廠。
          2.實現(xiàn)一個具體的工廠---汽車工廠。
          3.工廠生產(chǎn)汽車A,得到汽車產(chǎn)品A。
          4.工廠生產(chǎn)汽車B,得到汽車產(chǎn)品B。

          這樣做,實現(xiàn)了購買者和生產(chǎn)線的隔離。

          Builder模式:
          1.離合器工廠生產(chǎn)離合器產(chǎn)品,得到汽車部件A。
          2.輪胎工廠生產(chǎn)輪子產(chǎn)品,得到汽車部件B。
          3.車身工廠生產(chǎn)車身產(chǎn)品,得到汽車部件C。
          4.將這些部件放到一起,形成剛好能夠組裝成一輛汽車的整體。
          5.將這個整體送到汽車組裝工廠,得到一個汽車產(chǎn)品。

          或者更抽象一點理解:
          1.將汽車的每一個零件都送到汽車組裝工廠。
          2.在工廠里,組裝離合器,得到汽車部件A。
          3.在工廠里,組裝輪胎,得到汽車部件B。
          4.在工廠里,組裝車身,得到汽車部件C。
          5.在工廠里,組裝每個部件,得到一個汽車產(chǎn)品。

          這樣做,目的是為了實現(xiàn)復(fù)雜對象生產(chǎn)線和其部件的解耦。

          二者不同在于:
          Factory模式不考慮對象的組裝過程,而直接生成一個我想要的對象。
          Builder模式先一個個的創(chuàng)建對象的每一個部件,再統(tǒng)一組裝成一個對象。
          Factory模式所解決的問題是,工廠生產(chǎn)產(chǎn)品。而Builder模式所解決的問題是工廠控制產(chǎn)品生成器組裝各個部件的過程,然后從產(chǎn)品生成器中得到產(chǎn)品。

          2.開闊天空
          我在學(xué)習(xí)的時候,把代碼例子認(rèn)真的讀了一遍,便豁然開朗。


          學(xué)習(xí)模式的目的在于了解此模式究竟為何模式。了解了此模式的結(jié)構(gòu)已足矣。給我的感覺,模式就是一種思想。學(xué)習(xí)一個模式,花上一兩個小時把此模式的意思理解了,就夠了。其精華的所在會在以后工作的設(shè)計中逐漸體現(xiàn)出來。

          首先,當(dāng)一個產(chǎn)品(對象)的創(chuàng)建過程很復(fù)雜的時候,且這個產(chǎn)品的實現(xiàn)需要分別實現(xiàn)幾個不同的部件。這個時候,我們考慮用到Builder模式。具體實現(xiàn)過程的例子如下:

          Product: 復(fù)雜對象類。我們最終就是為了得到它的一個對象。我叫它產(chǎn)品

          // 這里有一個復(fù)雜對象類Product。它的構(gòu)建需要PartA,PartB,PartC。
          public class Product  {
              
          public Product(Part partA, Part partB, Part partC){...};
          }


          Part: 復(fù)雜對象的部件接口。沒準(zhǔn)有幾種。體現(xiàn)對象的復(fù)雜性。即產(chǎn)品部件。

          // 復(fù)雜對象部件接口Part。
          public interface Part{
              
          //
          }

          CarBuilder: 復(fù)雜對象的構(gòu)建接口。Builder模式的重要體現(xiàn)之一---產(chǎn)品生成器。
          // 這里定義一個產(chǎn)品生成器接口。
          public interface CarBuilder {
              
          // 創(chuàng)建部件A
              void buildPartA();

              
          // 創(chuàng)建部件B
              void buildPartB();

              
          // 創(chuàng)建部件C
              void buildPartC();

              
          // 返回產(chǎn)品,不用的組裝過程會返回不同的產(chǎn)品。
              Product getResult();
          }

          MazidaBuilder: 具體的產(chǎn)品生成器對象。
          // 實現(xiàn)具體的產(chǎn)品生成器
          public class MazidaBuilder implements CarBuilder {
              Part partA, partB, partC;

              
          public void buildPartA() {
                  
          // 這里是具體如何構(gòu)建partA的代碼
                  partA = ;
              }
          ;

              
          public void buildPartB() {
                  
          // 這里是具體如何構(gòu)建partB的代碼
                  partB = ;
              }
          ;

              
          public void buildPartC() {
                  
          // 這里是具體如何構(gòu)建partB的代碼
                  partC = ;
              }
          ;

              
          public Product getResult() {
                  
          // 返回最后組裝成品結(jié)果
                  return new Product(partA,partB,partC);
              }

          }

          ConstructFactory: Builder模式的重要體現(xiàn)之二---產(chǎn)品組裝工廠
          // 建立產(chǎn)品組裝工廠,用來實現(xiàn)構(gòu)建復(fù)雜對象的過程。
          class ConstructFactory {
              
          // 工廠里有一個產(chǎn)品生成器
              private CarBuilder carBuilder;

              
          public ConstructFactory(CarBuilder carBuilder) {
                  
          this.carBuilder = carBuilder;
              }


              
          // 在這里實現(xiàn)部件的組裝及汽車的組裝。
              public void construct() {
                  
          // 組裝部件A
                  carBuilder.buildPartA();
                  
          // 組裝部件B
                  carBuilder.buildPartB();
                  
          // 組裝部件C
                  carBuilder.buildPartC();
              }
          // 到此,汽車組裝完畢。
          }

          Temple:
          // 具體得到一個產(chǎn)品的過程
          public static void main(String args[]){
              
          // 建立產(chǎn)品生成器對象
              MazidaBuilder ma6Builder = new MazidaBuilder();
              
          // 建立產(chǎn)品組裝工廠,由工廠操作產(chǎn)品生成器進行組裝。
              ConstructFactory cf = new ConstructFactory( ma6Builder ); 
              
          // 開始組裝。這里,改變工廠的組裝過程,就可以組裝成不同的產(chǎn)品。
              cf.construct(); 
              
          // 組裝完畢
              
          // 從產(chǎn)品生成器中得到產(chǎn)品
              Product product = ma6Builder.getResult(); 
          }

          理解Builder模式,主要就是理解上面這幾個過程。

          Builder模式不是很常用。模式本身就是一種思想。知道了就可以了。

          歡迎來訪!^.^!
          本BLOG僅用于個人學(xué)習(xí)交流!
          目的在于記錄個人成長.
          所有文字均屬于個人理解.
          如有錯誤,望多多指教!不勝感激!

          Feedback

          # re: GOF設(shè)計模式學(xué)習(xí)筆記(三)---Builder模式   回復(fù)  更多評論   

          2007-05-18 09:01 by 大田斗
          模式本身是一種思想?思想是用來指導(dǎo)的。究其目的,不過是在我們開發(fā)代碼中提供一種套路。

          # re: GOF設(shè)計模式學(xué)習(xí)筆記(三)---Builder模式   回復(fù)  更多評論   

          2007-12-02 23:38 by lihe
          public Product getResult() {
          // 返回最后組裝成品結(jié)果
          return new Product(partA,partB,partC);
          }
          ???
          接口能 new???

          # re: GOF設(shè)計模式學(xué)習(xí)筆記(三)---Builder模式 [未登錄]  回復(fù)  更多評論   

          2009-03-26 15:59 by alex
          你對builder模式?jīng)]有理解到精華之處,

          同一個過程創(chuàng)造不同的表示,你應(yīng)該細(xì)細(xì)體會一下

          # re: GOF設(shè)計模式學(xué)習(xí)筆記(三)---Builder模式   回復(fù)  更多評論   

          2009-06-02 14:26 by ads
          你對builder的理解錯誤了

          Copyright © 久城

          主站蜘蛛池模板: 新余市| 曲靖市| 开封市| 荥阳市| 宁晋县| 邵武市| 区。| 磐石市| 长乐市| 资阳市| 托里县| 沽源县| 连江县| 左权县| 印江| 桂平市| 绍兴县| 西乌珠穆沁旗| 洛川县| 宣恩县| 峡江县| 舒兰市| 洛隆县| 涡阳县| 葵青区| 武鸣县| 荆州市| 育儿| 特克斯县| 英山县| 天水市| 萍乡市| 丘北县| 石景山区| 五常市| 莱州市| 邵武市| 连云港市| 全州县| 政和县| 哈尔滨市|