<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-126  評論-247  文章-5  trackbacks-0

    Builder 模式 —— 建造者模式(又譯成生成器模式的主要功能是構建復雜的產品,它是將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。

    舉個例子,打個生產電腦的比方,這里簡單一點,假設生產電腦只需要 CUP、內存和顯卡,現在需要生產宏基和戴爾兩個品牌的電腦,不用設計模式的實現:

    Acer.java

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

    public class Acer{

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


        
    //生產內存
        public void createMemory() {

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


        
    //生產顯卡
        public void createDisplayCard() {

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

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

        }


    }



    Dell.java

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

    public class Dell{

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

        
    //生產CPU
        public void createCPU() {

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


        
    //生產內存
        public void createMemory() {

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


        
    //生產顯卡
        public void createDisplayCard() {

            parts.add(
    "顯卡: NVIDIA GeForce GT 640M+Intel GMA HD 4000");
        }


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

        }


    }



    Client.java

    /**
     * -----------------------------------------
     * @描述  客戶端測試
     * @作者  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();
        }

        
    }



    仔細觀察一下上面的實現,不難發現,不管是生產何種品牌的筆記本,在實現的時候,它們的步驟基本上都是一樣的,都是生產電腦相應的部件并添加都電腦里面,在生產不同品牌電腦

    的時候,都會重復處理這幾個步驟,但是明顯的是,這幾個步驟都是穩定的或者說是一樣的,只是每個步驟的具體實現不一樣或者說是變化的,如果將這些變化的部分抽取出來,也就是

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

    使用 Builder 模式的實現,如圖:


    Product.java

    package pattern.builder;

    import java.util.ArrayList;
    import java.util.List;
    /**
     * -----------------------------------------
     * @描述  抽象產品
     * @作者  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);
        }


        
    //顯示產品信息
        public void show(){
            System.out.print(
    "產品部件信息:");
            
    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();
        
        
    //內存
        public void buildMemory();
        
        
    //顯卡
        public void buildDisplayCard ();
        
        
    //最終產品
        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(
    "內存: 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(
    "內存: 8GB DDR3 1600MHz");
        }


        @Override
        
    public void buildDisplayCard() {

            product.add(
    "顯卡: NVIDIA GeForce GT 640M+Intel GMA HD 4000");
        }


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


    }



    Director.java

    package pattern.builder;
    /**
     * -----------------------------------------
     * @描述  產品構建指導者
     * @作者  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;
    /**
     * -----------------------------------------
     * @描述  客戶端測試
     * @作者  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();
        }

        
    }



    后臺輸出:

    宏基產品部件信息:CUP: Intel 酷睿i3 2350M       內存: 4GB DDR3 1333MHz    顯卡: NVIDIA GeForce GT 520M    
    戴爾產品部件信息:CUP: Intel 酷睿i7 3612QM    內存: 8GB DDR3 1600MHz    顯卡: NVIDIA GeForce GT 640M+Intel GMA HD 
    4000


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

    和具體的 Bulider 實現類。

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

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

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

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

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


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

    評論:
    # re: java 建造者模式(Builder) 2013-02-20 17:35 | rexue
    一看就懂,太好太詳細了  回復  更多評論
      
    # re: java 建造者模式(Builder) 2013-04-18 14:28 | Willy
    謝謝您!  回復  更多評論
      
    # re: java 建造者模式(Builder) 2013-10-11 10:58 | 經典小笑話
    看了幾篇相關的,終于第一篇讓我明白了。因為有一個"不用設計模式的實現",謝謝了,呵~  回復  更多評論
      
    # re: java 建造者模式(Builder) 2016-08-02 11:41 | Nimo
    多謝,講的很清楚  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 狼人大香伊蕉国产WWW亚洲| 亚洲国产精品一区二区成人片国内 | 国产又粗又长又硬免费视频| 成年女人男人免费视频播放| 无码国产精品一区二区免费式直播 | 亚洲天天在线日亚洲洲精| 亚洲乱亚洲乱妇无码麻豆| 亚洲中文字幕在线第六区| 亚洲情综合五月天| 亚洲av无码无在线观看红杏| 久久久久亚洲精品影视| 中文字幕亚洲免费无线观看日本| 亚洲自偷自拍另类12p| 亚洲精品高清国产麻豆专区| 亚洲成a人片在线观看中文app| 亚洲国产中文在线视频| 在线观看日本亚洲一区| 激情无码亚洲一区二区三区 | 亚洲男人天堂av| 亚洲综合免费视频| 一本色道久久综合亚洲精品蜜桃冫| 亚洲国产一区二区三区在线观看| 在线观看亚洲网站| 国产V片在线播放免费无码| 国产色无码精品视频免费| 91短视频在线免费观看| 免费无码精品黄AV电影| 免费一级毛片在线观看| 国产精品亚洲美女久久久| 久久精品国产亚洲网站| 亚洲精品网站在线观看你懂的| 中文字幕在线观看亚洲视频| 国产亚洲福利精品一区二区| 中国毛片免费观看| 免费成人激情视频| 日韩中文无码有码免费视频| 久久亚洲精品无码观看不卡| 亚洲系列中文字幕| 香蕉视频免费在线| 午夜无码A级毛片免费视频| 成人免费福利电影|