白话设计模式——Builder
生成器模式,用于創(chuàng)建復(fù)雜對(duì)象。當(dāng)我們的軟件系統(tǒng)中出現(xiàn)了這樣的情況時(shí)——我們需要一個(gè)比較復(fù)雜的對(duì)象,它的外觀(接口)我們是知道的,但是他的組成(各種各樣的組成)我們并不關(guān)心,而且他的構(gòu)造過(guò)程(比如先后順序)我們也不關(guān)心——這時(shí),我們就需要用到Builder模式了。
還是拿廣本來(lái)打比方。廣本的四個(gè)車間,最開(kāi)頭的是沖壓科,而在沖壓科的門口有一間小房子,里面放了一臺(tái)激光焊接機(jī),它用它的機(jī)械手臂抓起旁邊放著的各種各樣的鋼板,不停的焊接??赡苡腥艘獑?wèn),這是什么例子?這就是生成器!一般來(lái)說(shuō),汽車各處外殼的厚度以及硬度是不同的,比如車頭部分就要夠硬(用來(lái)撞的^_^),其他一些地方比如車頂就沒(méi)有必要用超厚的鋼板。這樣,一來(lái)可以降低整車的質(zhì)量,可以省油;二來(lái)可以降低成本(所以廣本暴利啊~~其實(shí)其他汽車廠家也這么干)先前所講的焊接機(jī)就是干這個(gè)事情的,它將各種不同厚度不同硬度的鋼板焊接在一起,供那些巨型的沖壓機(jī)來(lái)沖壓成型,以生產(chǎn)汽車的各個(gè)不同的部分。各種汽車所使用的合成鋼板的組成是不一樣的,但沖壓機(jī)不管那么多,它只管壓鋼板。這樣一來(lái)就明白了吧?焊接機(jī)將各種鋼板按照規(guī)定焊接成不同組成的合成鋼板,至于它是如何焊接的以及合成鋼板的組成,沖壓機(jī)對(duì)這些信息是不關(guān)心的。
我們來(lái)看一個(gè)類圖。
?
?
這張簡(jiǎn)單的類圖跟《設(shè)計(jì)模式》書中有顯著的不同。因?yàn)槲抑饕怯脕?lái)說(shuō)明上面的例子的,跟書中提及的例子不同。這個(gè)圖中,焊接機(jī)由焊接程序控制,以生產(chǎn)不同規(guī)格的鋼板,沖壓機(jī)僅僅是調(diào)用焊接機(jī)的GetSteel方法來(lái)獲得焊好的鋼板。其實(shí),這樣的情況在我們平時(shí)的程序中用得更多一些,即某一個(gè)類僅僅是要得到一個(gè)產(chǎn)品,而產(chǎn)品的一切信息它均不知曉。當(dāng)我們需要另外一種規(guī)格的鋼板時(shí),更換相應(yīng)的程序就可以了。
在MS給我們的類庫(kù)中,有一個(gè)叫做StringBuilder的類,這就是一個(gè)例子。我們給它不同的字符串或是其他對(duì)象(這些就可以看作是原材料),根據(jù)我們輸入的順序(組裝過(guò)程),我們可以得到我們想要的一個(gè)字符串。
把這個(gè)類圖串換成代碼(這個(gè)代碼實(shí)在不怎么樣,還好,這只是一個(gè)說(shuō)明,如果我在工作中寫出這樣的東西來(lái),我就可以體驗(yàn)一下從17樓飛下的感覺(jué)了,^_^)
Builder????public?class?Steel
????{
????????public?object?Part00;
????????public?object?Part01;
????????public?object?Part10;
????????public?object?Part11;
????}
????public?class?WeldingProgramme
????{
????????object[]?_materials;
????????public?WeldingProgramme()
????????{
????????????this._materials?=?new?object[4];
????????????//?TODO:?Add?some?materials
????????}
????????public?Steel?Go()
????????{
????????????SteelWelder?sw?=?new?SteelWelder();
????????????foreach(object?m?in?this._materials)
????????????{
????????????????sw.WeldSteel(m);
????????????}
????????????//????you?can?weld?the?steel?like?this
????????????//????sw.WeldSteel(this._materials[3]);
????????????//????sw.WeldSteel(this._materials[2]);
????????????//????sw.WeldSteel(this._materials[1]);
????????????//????sw.WeldSteel(this._materials[0]);
????????????//????also,?you?can?do?it?like?this
????????????//????sw.WeldSteel(this._materials[2]);
????????????//????sw.WeldSteel(this._materials[1]);
????????????//????sw.WeldSteel(this._materials[0]);
????????????//????sw.WeldSteel(this._materials[3]);
????????????return?sw.GetSteel();
????????}
????}
????public?class?SteelWelder
????{
????????Steel?_steel;
????????public?void?WeldSteel(object?materials)
????????{
????????????if(this._steel?==?null)
????????????????this._steel?=?new?Steel();
????????????if(this._steel.Part00?==?null)
????????????{
????????????????this._steel.Part00?=?materials;
????????????}
????????????else?if(this._steel.Part01?==?null)
????????????{
????????????????this._steel.Part01?=?materials;
????????????}
????????????else?if(this._steel.Part10?==?null)
????????????{
????????????????this._steel.Part10?=?materials;
????????????}
????????????else?if(this._steel.Part11?==?null)
????????????{
????????????????this._steel.Part11?=?materials;
????????????}
????????????else
????????????{
????????????????throw?new?Exception("what?do?you?want?");
????????????}
????????}
????????public?Steel?GetSteel()
????????{
????????????return?this._steel;
????????}
????}
????public?class?Punch
????{
????????private?Steel?_steel;
????????public?void?Work()
????????{
????????????WeldingProgramme?wp?=?new?WeldingProgramme();
????????????this._steel?=?wp.Go();
????????????//?TODO:?Punch?the?Steel
????????}
????}
?
從類圖以及代碼實(shí)例中,我們看到Builder的一些優(yōu)勢(shì)了。在我們需要不同的原料以生產(chǎn)不同的產(chǎn)品時(shí),不用更改一大片的代碼,僅僅更改指導(dǎo)Builder工作的向?qū)Ь涂梢粤恕T诒纠?#xff0c;也就是更改焊接程序,根本不會(huì)有什么產(chǎn)品的抽象類。我們當(dāng)然也可以實(shí)現(xiàn)一個(gè)Builder的父類,以實(shí)現(xiàn)更多的產(chǎn)品的制造。
生成器模式主要用的地方就是組合一些比較復(fù)雜的產(chǎn)品,而且這個(gè)產(chǎn)品的組合方式是多種多樣的。
回到目錄
上一篇:Abstract Factory
下一篇:Factory Method
總結(jié)
以上是生活随笔為你收集整理的白话设计模式——Builder的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 请专家帮我配一套适合油性皮肤的护肤品!要
- 下一篇: [导入]SunriseUpload.0.