隨筆-126  評(píng)論-247  文章-5  trackbacks-0

          Builder 模式 —— 建造者模式(又譯成生成器模式的主要功能是構(gòu)建復(fù)雜的產(chǎn)品,它是將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。

          舉個(gè)例子,打個(gè)生產(chǎn)電腦的比方,這里簡單一點(diǎn),假設(shè)生產(chǎn)電腦只需要 CUP、內(nèi)存和顯卡,現(xiàn)在需要生產(chǎn)宏基和戴爾兩個(gè)品牌的電腦,不用設(shè)計(jì)模式的實(shí)現(xiàn):

          Acer.java

          import java.util.ArrayList;
          import java.util.List;
          /**
           * -----------------------------------------
           * @描述  生產(chǎn)宏基筆記本電腦
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-4 <p>
           * -----------------------------------------
           
          */

          public class Acer{

              
          protected List<String> parts = new ArrayList<String>();
              
              
          //生產(chǎn)CPU
              public void createCPU() {
                  
                  parts.add(
          "CUP: Intel 酷睿i3 2350M");
              }


              
          //生產(chǎn)內(nèi)存
              public void createMemory() {

                  parts.add(
          "內(nèi)存: 4GB DDR3 1333MHz");
              }


              
          //生產(chǎn)顯卡
              public void createDisplayCard() {

                  parts.add(
          "顯卡: NVIDIA GeForce GT 520M");
              }

              
              
          //顯示產(chǎn)品信息
              public void show(){
                  System.out.print(
          "產(chǎn)品部件信息:");
                  
          for(String part : parts){
                      System.out.print(part 
          + "\t");
                  }

              }


          }



          Dell.java

          import java.util.ArrayList;
          import java.util.List;
          /**
           * -----------------------------------------
           * @描述  生產(chǎn)戴爾筆記本電腦
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-4 <p>
           * -----------------------------------------
           
          */

          public class Dell{

              
          protected List<String> parts = new ArrayList<String>();

              
          //生產(chǎn)CPU
              public void createCPU() {

                  parts.add(
          "CUP: Intel 酷睿i7 3612QM");
              }


              
          //生產(chǎn)內(nèi)存
              public void createMemory() {

                  parts.add(
          "內(nèi)存: 8GB DDR3 1600MHz");
              }


              
          //生產(chǎn)顯卡
              public void createDisplayCard() {

                  parts.add(
          "顯卡: NVIDIA GeForce GT 640M+I(xiàn)ntel GMA HD 4000");
              }


              
          //顯示產(chǎn)品信息
              public void show(){
                  System.out.print(
          "產(chǎn)品部件信息:");
                  
          for(String part : parts){
                      System.out.print(part 
          + "\t");
                  }

              }


          }



          Client.java

          /**
           * -----------------------------------------
           * @描述  客戶端測(cè)試
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-4 <p>
           * -----------------------------------------
           
          */

          public class Client {

              
          private static Acer acer = new Acer();
              
          private static Dell dell = new Dell();
              
              
          public static void main(String[] args){

                  
          /**
                   * 宏基
                   
          */

                  acer.createCPU();
                  acer.createMemory();
                  acer.createDisplayCard();
                  acer.show();
                  
                  
          /***************************************/
                  System.out.println();
                  
          /***************************************/
                  
                 
          /**
                   * 戴爾
                   
          */

                  dell.createCPU();
                  dell.createMemory();
                  dell.createDisplayCard();
                  dell.show();
              }

              
          }



          仔細(xì)觀察一下上面的實(shí)現(xiàn),不難發(fā)現(xiàn),不管是生產(chǎn)何種品牌的筆記本,在實(shí)現(xiàn)的時(shí)候,它們的步驟基本上都是一樣的,都是生產(chǎn)電腦相應(yīng)的部件并添加都電腦里面,在生產(chǎn)不同品牌電腦

          的時(shí)候,都會(huì)重復(fù)處理這幾個(gè)步驟,但是明顯的是,這幾個(gè)步驟都是穩(wěn)定的或者說是一樣的,只是每個(gè)步驟的具體實(shí)現(xiàn)不一樣或者說是變化的,如果將這些變化的部分抽取出來,也就是

          說如果將處理過程與具體的步驟的實(shí)現(xiàn)分離開來的話,這樣就能夠復(fù)用這些處理過程,而且這樣一來就能很容易的做到在不同品牌電腦之間切換生產(chǎn)。

          使用 Builder 模式的實(shí)現(xiàn),如圖:


          Product.java

          package pattern.builder;

          import java.util.ArrayList;
          import java.util.List;
          /**
           * -----------------------------------------
           * @描述  抽象產(chǎn)品
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public abstract class Product {

              
          protected List<String> parts = new ArrayList<String>();
              
              
          //添加部件
              public void add(String part){
                  parts.add(part);
              }


              
          //顯示產(chǎn)品信息
              public void show(){
                  System.out.print(
          "產(chǎn)品部件信息:");
                  
          for(String part : parts){
                      System.out.print(part 
          + "\t");
                  }

              }

          }



          Acer.java

          package pattern.builder;
          /**
           * -----------------------------------------
           * @描述  宏基筆記本
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public class Acer extends Product{

              
          //Do other things here
              
          }



          Dell.java

          package pattern.builder;
          /**
           * -----------------------------------------
           * @描述  戴爾筆記本
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public class Dell extends Product{

              
          //Do other things here
              
          }



          Builder.java

          package pattern.builder;
          /**
           * -----------------------------------------
           * @描述  抽象建造者
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public interface Builder {

              
          //CUP
              public void buildCPU();
              
              
          //內(nèi)存
              public void buildMemory();
              
              
          //顯卡
              public void buildDisplayCard ();
              
              
          //最終產(chǎn)品
              public Product getFinalResult();
              
          }



          AcerBuilder.java

          package pattern.builder;
          /**
           * -----------------------------------------
           * @描述  宏基筆記本建造者
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public class AcerBuilder implements Builder {

              
          private Product product = new Acer();
              
              @Override
              
          public void buildCPU() {
                  
                  product.add(
          "CUP: Intel 酷睿i3 2350M");
              }


              @Override
              
          public void buildMemory() {

                  product.add(
          "內(nèi)存: 4GB DDR3 1333MHz");
              }


              @Override
              
          public void buildDisplayCard() {

                  product.add(
          "顯卡: NVIDIA GeForce GT 520M");
              }


              @Override
              
          public Product getFinalResult() {
                  
                  
          return product;
              }


          }



          DellBuilder.java

          package pattern.builder;
          /**
           * -----------------------------------------
           * @描述  戴爾筆記本建造者
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public class DellBuilder implements Builder {

              
          private Product product = new Dell();
              
              @Override
              
          public void buildCPU() {
                  
                  product.add(
          "CUP: Intel 酷睿i7 3612QM");
              }


              @Override
              
          public void buildMemory() {

                  product.add(
          "內(nèi)存: 8GB DDR3 1600MHz");
              }


              @Override
              
          public void buildDisplayCard() {

                  product.add(
          "顯卡: NVIDIA GeForce GT 640M+I(xiàn)ntel GMA HD 4000");
              }


              @Override
              
          public Product getFinalResult() {
                  
                  
          return product;
              }


          }



          Director.java

          package pattern.builder;
          /**
           * -----------------------------------------
           * @描述  產(chǎn)品構(gòu)建指導(dǎo)者
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public class Director {

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

              
              
          public void construct(){
                  
                  builder.buildCPU();
                  builder.buildMemory();
                  builder.buildDisplayCard();
              }

          }



          Client.java

          package pattern.builder;
          /**
           * -----------------------------------------
           * @描述  客戶端測(cè)試
           * @作者  fancy
           * @郵箱  fancydeepin@yeah.net
           * @日期  2012-8-5 <p>
           * -----------------------------------------
           
          */

          public class Client {

              
          private static Builder acerBuilder = new AcerBuilder(),
                                                          dellBuilder 
          = new DellBuilder();
              
              
          public static void main(String[] args){
                  
                  System.out.print(
          "宏基");
                  Director director 
          = new Director(acerBuilder);
                  director.construct();
                  Product product 
          = acerBuilder.getFinalResult();
                  product.show();
                  
                  
          /***************************************/
                  System.out.println();
                  
          /***************************************/
                  
                  System.out.print(
          "戴爾");
                  director 
          = new Director(dellBuilder);
                  director.construct();
                  product 
          = dellBuilder.getFinalResult();
                  product.show();
              }

              
          }



          后臺(tái)輸出:

          宏基產(chǎn)品部件信息:CUP: Intel 酷睿i3 2350M       內(nèi)存: 4GB DDR3 1333MHz    顯卡: NVIDIA GeForce GT 520M    
          戴爾產(chǎn)品部件信息:CUP: Intel 酷睿i7 3612QM    內(nèi)存: 8GB DDR3 1600MHz    顯卡: NVIDIA GeForce GT 640M+I(xiàn)ntel GMA HD 
          4000


          在這里,Acer 類和 Dell 類是空的,如果是這種情況,那么它們可以省略掉,如果 Product 也不是最終想要的,那么它也可以被省略掉,最終剩下的就只有 Director、Builder、

          和具體的 Bulider 實(shí)現(xiàn)類。

          在這里,Acer 類和 Dell 類是有關(guān)系的兩個(gè)類,它們都是電腦的品牌之一,如果遇到兩個(gè)或多個(gè)沒有太多關(guān)系的類,假設(shè) Acer 類代表電腦,Dell 類代表汽車,很明顯,Acer 類和

          Dell 類就不應(yīng)該再有共同的父類,也就是這種情況下,Product 這個(gè)抽象類不存在了,這時(shí)候問題就來了,那么 Builder 接口的規(guī)定的 getFinalResult() 方法的返回值怎么確定呢??

          如果它的返回值
          類型是 Acer,那么 DellBuilder 類就會(huì)有問題,如果它的返回值類型是 Dell,那么 AcerBuilder 類就會(huì)有問題;

          很明顯,這是由于類型不能正確匹配引起的,如果是這種情況,可以將 Product 設(shè)計(jì)成標(biāo)識(shí)接口(空接口,接口里面沒有規(guī)定任何行為方法),再讓這些沒有相互關(guān)系的具體產(chǎn)品類

          都去實(shí)現(xiàn)這個(gè)接口,那么 Builder 接口里面規(guī)定的 getFinalResult() 方法的返回值類型依然是 Product 類型,這樣一來問題就解決了。


            
          posted on 2012-08-05 14:03 fancydeepin 閱讀(5856) 評(píng)論(4)  編輯  收藏

          評(píng)論:
          # re: java 建造者模式(Builder) 2013-02-20 17:35 | rexue
          一看就懂,太好太詳細(xì)了  回復(fù)  更多評(píng)論
            
          # re: java 建造者模式(Builder) 2013-04-18 14:28 | Willy
          謝謝您!  回復(fù)  更多評(píng)論
            
          # re: java 建造者模式(Builder) 2013-10-11 10:58 | 經(jīng)典小笑話
          看了幾篇相關(guān)的,終于第一篇讓我明白了。因?yàn)橛幸粋€(gè)"不用設(shè)計(jì)模式的實(shí)現(xiàn)",謝謝了,呵~  回復(fù)  更多評(píng)論
            
          # re: java 建造者模式(Builder) 2016-08-02 11:41 | Nimo
          多謝,講的很清楚  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 濮阳县| 通河县| 晋城| 黔江区| 怀宁县| 和田县| 宁陵县| 曲麻莱县| 天峻县| 河池市| 甘谷县| 共和县| 伊通| 潞城市| 福海县| 凤冈县| 云梦县| 张家港市| 广饶县| 大城县| 泰安市| 龙井市| 永宁县| 马山县| 天镇县| 蒙山县| 黄山市| 林芝县| 淄博市| 江川县| 井冈山市| 台北县| 通化县| 广宁县| 怀来县| 寻乌县| 砀山县| 全南县| 霞浦县| 黄山市| 巴林右旗|