posts - 73,  comments - 55,  trackbacks - 0
          Builder模式定義:
          將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示.

          Builder模式是一步一步創建一個復雜的對象,它允許用戶可以只通過指定復雜對象的類型和內容就可以構建它們.用戶不知道內部的具體構建細節.Builder模式是非常類似抽象工廠模式,細微的區別大概只有在反復使用中才能體會到.

          為何使用?
          是為了將構建復雜對象的過程和它的部件解耦.注意: 是解耦過程部件.

          因為一個復雜的對象,不但有很多大量組成部分,如汽車,有很多部件:車輪 方向盤 發動機還有各種小零件等等,部件很多,但遠不止這些,如何將這些部件裝配成一輛汽車,這個裝配過程也很復雜(需要很好的組裝技術),Builder模式就是為了將部件和組裝過程分開.

          如何使用?
          首先假設一個復雜對象是由多個部件組成的,Builder模式是把復雜對象的創建和部件的創建分別開來,分別用Builder類和Director類來表示.

          首先,需要一個接口,它定義如何創建復雜對象的各個部件:

          public interface Builder {

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

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

          }

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

          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();

            }

          }

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

          public class ConcreteBuilder implements Builder {

            Part partA, partB, partC;
            public void buildPartA() {
              //這里是具體如何構建partA的代碼

            };
            public void buildPartB() {
              //這里是具體如何構建partB的代碼
            };
             public void buildPartC() {
              //這里是具體如何構建partB的代碼
            };
             public Product getResult() {
              //返回最后組裝成品結果
            };

          }

          復雜對象:產品Product:

          public interface Product { }

          復雜對象的部件:

          public interface Part { }


          我們看看如何調用Builder模式:
          ConcreteBuilder builder = new ConcreteBuilder();
          Director director = new Director( builder );

          director.construct();
          Product product = builder.getResult();
          -------------------------------------------------
          通俗講解:Builder模式的理解


          簡單地說,就好象我要一座房子住,可是我不知道怎么蓋(簡單的砌墻,層次較低),也不知道怎么樣設計(建幾個房間,幾個門好看,層次較高), 于是我需要找一幫民工,他們會砌墻,還得找個設計師,他知道怎么設計,我還要確保民工聽設計師的領導,而設計師本身也不干活,光是下命令,這里砌一堵墻,這里砌一扇門,這樣民工開始建設,最后,我可以向民工要房子了。在這個過程中,設計師是什么也沒有,除了他在腦子里的設計和命令,所以要房子也是跟民工要,記住了!

          就象國內好多企業上erp一樣,上erp,首先得找軟件公司呀,找到軟件公司后,軟件公司說,我只知道怎么寫軟件,就知道怎么實現,不清楚整個erp的流程。好,那我們還得找一個咨詢公司,好,找到德勤了,德勤說好,我要軟件怎么做,軟件公司怎么做,我就能保證軟件能為你們提供erp系統了。

          此模式是為了讓設計和施工解耦,互不干擾。


          package builder;

          public interface Builder
          {
          public? void makeWindow();
          public? void makeFloor();
          public? Room? getRoom();

          }


          /*************************************************************/
          package builder;

          public class Designer {

          ? public Designer() {
          ? }
          ? public void order(Builder? builder)?
          {
          ? builder.makeWindow();
          ? builder.makeFloor();

          }
          }

          /*************************************************************/
          package builder;
          public class Mingong? implements Builder{
          ? private? String window="";
          ? private? String floor="";
          ? public Mingong() {
          ? }
          ? public? void makeWindow(){
          ? window=new String("window");
          ? }
          ? public? void makeFloor(){
          ? floor=new String("floor");
          ? }
          ? public? Room? getRoom()
          ? {
          ? if((!window.equals(""))&&(!floor.equals("")))
          ??? {
          ??? Room r = new Room();
          ??? r.setFloor(floor);
          ??? r.setWindow(window);
          ??? return r;
          ??? }
          ? else return null;
          ? }
          }

          /*************************************************************/
          package builder;
          public class Room {
          ? private? String window="";
          ? private? String floor="";
          ? public Room() {
          ? }
          ?public String getFloor() {
          ??return floor;
          ?}

          ?public void setFloor(String floor) {
          ??this.floor = floor;
          ?}

          ?public String getWindow() {
          ??return window;
          ?}

          ?public void setWindow(String window) {
          ??this.window = window;
          ?}
          }
          /*************************************************************/

          package builder;

          public class Client {

          ? public Client() {
          ? }
          ? public static void main(String[] args) {
          ???? Builder mingong=new Mingong();
          ???? Designer? designer=new????? Designer();
          ???? designer.order(mingong);
          ?????Room r?= mingong.getRoom();
          ???? System.out.println(r.getWindow);//會輸出window,表示構建成功。
          ? }
          }

          posted on 2006-07-24 15:19 保爾任 閱讀(4366) 評論(4)  編輯  收藏 所屬分類: Design Patten

          FeedBack:
          # re: Builder(生成器)模式
          2010-11-15 18:51 | 南通SEO
          受教了  回復  更多評論
            
          # re: Builder(生成器)模式[未登錄]
          2012-11-05 16:49 | lb
          眾里尋他千百度 這才是我要的文章 謝謝分享  回復  更多評論
            
          # re: Builder(生成器)模式[未登錄]
          2013-02-27 13:55 | hgd
          設計和施工不要相互影響  回復  更多評論
            
          # re: Builder(生成器)模式
          2015-09-01 22:53 | 憂桑的可樂雞
          果斷收藏  回復  更多評論
            

          <2015年9月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 九龙坡区| 财经| 蕲春县| 胶州市| 黄龙县| 黄冈市| 眉山市| 上林县| 六枝特区| 宜良县| 舟山市| 龙里县| 贺兰县| 上林县| 高碑店市| 平山县| 宜阳县| 多伦县| 信阳市| 嘉黎县| 繁峙县| 彭泽县| 阳朔县| 神池县| 尚志市| 裕民县| 定兴县| 陵川县| 华安县| 闸北区| 义马市| 丰都县| 弥渡县| 遵化市| 娄烦县| 伊宁县| 河池市| 隆回县| 锦州市| 喜德县| 海阳市|