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