<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 模式 —— 建造者模式(又譯成生成器模式的主要功能是構(gòu)建復(fù)雜的產(chǎn)品,它是將一個(gè)復(fù)雜對象的構(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

    /**
     * -----------------------------------------
     * @描述  客戶端測試
     * @作者  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í)候,都會重復(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;
    /**
     * -----------------------------------------
     * @描述  客戶端測試
     * @作者  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();
        }

        
    }



    后臺輸出:

    宏基產(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 類就會有問題,如果它的返回值類型是 Dell,那么 AcerBuilder 類就會有問題;

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

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


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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 最好看的中文字幕2019免费| 91av视频免费在线观看| 亚洲深深色噜噜狠狠爱网站| 久久国产免费观看精品3| 亚洲欧美国产日韩av野草社区| 夜色阁亚洲一区二区三区| 色欲色香天天天综合网站免费 | 国产成人精品日本亚洲直接 | 亚洲国产精品无码久久久| 国产小视频免费观看| 久久精品免费视频观看| 亚洲一区精彩视频| 国产黄色一级毛片亚洲黄片大全| 亚洲网站免费观看| 一级人做人爰a全过程免费视频| 亚洲欧洲在线播放| 亚洲免费视频一区二区三区| 免费A级毛片无码无遮挡内射| 国产成人精品免费视频大全| 国产成人精品日本亚洲专区6| 国产aⅴ无码专区亚洲av麻豆 | 999国内精品永久免费观看| 老司机午夜在线视频免费 | 国产性生大片免费观看性 | 三级网站免费观看| 亚洲av永久中文无码精品综合 | www在线观看免费视频| 亚洲一区精彩视频| 亚洲AV电影院在线观看| 亚洲成人影院在线观看| 91香蕉成人免费网站| 国精产品一区一区三区免费视频| 日韩成人精品日本亚洲| 亚洲国产精品线观看不卡| 亚洲av无码不卡| 久久亚洲高清综合| 亚洲?v女人的天堂在线观看| 性xxxx视频播放免费| 色片在线免费观看| 在线看无码的免费网站| 任你躁在线精品免费|