設(shè)計(jì)模式(DesignPatterns)筆記之四:Builder

字號(hào):

概念:
    Builder:將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
    -------------------------------------------------------------------------------------
    “嘿,Andy,來幫幫忙,幫我裝裝機(jī)子吧?!?,Helen又在那喳喳呼呼了。
    “好的,好的,喔……,新機(jī)誒!”,走過去一看,AndyTao眼一亮。唉,看到人家的新配置,他就有一種據(jù)為己有的沖動(dòng)。說實(shí)在的,咱玩電腦的,沒幾個(gè)不這山望著那山高的。。。
    “這么大個(gè)丫頭,到現(xiàn)在還是不會(huì)裝機(jī)器。你怎么學(xué)的???”AndyTao嘴上這么說,心里想,“永遠(yuǎn)學(xué)不會(huì)!”
    “好的,好的,謝謝你嘛!不過,如果能把你的腦子也裝過來就好了?!?BR>    “嘿,不是吧,要求過分。。。。。。這樣吧,嗯,順便給你說說設(shè)計(jì)模式吧!”
    “這裝機(jī)也是個(gè)設(shè)計(jì)模式?”
    “聽下去!”
    “哦。。。”,Helen噘嘴的樣子真TMD可愛,AndyTao不覺想入非非了。
    “我就給你說說設(shè)計(jì)模式里的Builder模式好了。Builder模式是一步一步創(chuàng)建一個(gè)復(fù)雜的對(duì)象,它允許用戶可以只通過指定復(fù)雜對(duì)象的類型和內(nèi)容就可以構(gòu)建它們。用戶不知道內(nèi)部的具體構(gòu)建細(xì)節(jié)?!?BR>    “誒,這個(gè)和抽象工廠模式不是很相似么?”
    “Builder模式是非常類似抽象工廠模式,細(xì)微的區(qū)別大概只有在反復(fù)使用中才能體會(huì)到。待會(huì)我講講Builder和Abstract Factory模式之間的一些區(qū)別好了?!?BR>    “它一般用在下面兩種情況下:
    1、當(dāng)創(chuàng)建復(fù)雜對(duì)象的算法應(yīng)該獨(dú)立于該對(duì)象的組成部分以及它們的裝配方式時(shí)。
    2、當(dāng)構(gòu)造過程必須允許被構(gòu)造的對(duì)象有不同的表示時(shí)。
    上面的說法太抽象。簡(jiǎn)單點(diǎn)來說,它是為了將構(gòu)建復(fù)雜對(duì)象的過程和它的部件解耦,從而達(dá)到將一個(gè)復(fù)雜對(duì)象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示?!?BR>    “不懂……具體的來說呢?”
    “因?yàn)橐粋€(gè)復(fù)雜的對(duì)象,有大量組成部分,有時(shí)候多得讓人頭暈,就拿PC機(jī)來說吧:PC機(jī)有很多部件:
    主板,CPU,硬盤,顯示器……還有各種小零件,配件等等;部件很多,如何將這些部件裝配成一臺(tái)PC?
    這個(gè)裝配過程也很復(fù)雜,需要很好的組裝技術(shù)(還嚇不著你?),那么我們?yōu)榱烁玫慕M織PC機(jī)這個(gè)大對(duì)象,就需要一種相應(yīng)的方法來進(jìn)行裝配。我們要說的Builder模式也就是為了將部件和組裝過程分開而產(chǎn)生的。”
    “不明白……”
    “唉,笨笨,拿你沒辦法……”
    “這樣吧,我們說說具體怎么使用先!”
    “首先假設(shè)一個(gè)復(fù)雜對(duì)象是由多個(gè)部件組成的,Builder模式是把復(fù)雜對(duì)象的創(chuàng)建和部件的創(chuàng)建分別開來,分別用Builder類和Director類來表示?!?BR>    “首先,需要一個(gè)接口,它定義如何創(chuàng)建復(fù)雜對(duì)象的各個(gè)部件:
    public interface Builder {
    //創(chuàng)建部件A 比如生產(chǎn)主板
    void buildPartA();
    //創(chuàng)建部件B 比如生產(chǎn)CPU
    void buildPartB();
    //創(chuàng)建部件C 比如生產(chǎn)硬盤
    void buildPartC();
    ……
    //返回最后組裝成品結(jié)果 (返回最后裝配好的PC)
    //成品的組裝過程不在這里進(jìn)行,而是轉(zhuǎn)移到下面的Director類中進(jìn)行。
    //從而實(shí)現(xiàn)了過程和部件的分離
    Product getProduct();
    }
    用Director構(gòu)建最后的復(fù)雜對(duì)象,而在上面Builder接口中封裝的是如何創(chuàng)建一個(gè)個(gè)部件(復(fù)雜對(duì)象是由這
    些部件組成的),也就是說Director的內(nèi)容是如何將部件最后組裝成成品:
    public class Director {
    private Builder builder;
    public Director( Builder builder ) {
     this.builder = builder;
    }
    // 將部件partA partB partC最后組成復(fù)雜對(duì)象
    //這里是將主板、CPU和硬盤組裝成PC的過程
    public void construct() {
     builder.buildPartA();
     builder.buildPartB();
     builder.buildPartC();
    }
    }