白话设计模式——Builder
生成器模式,用于創建復雜對象。當我們的軟件系統中出現了這樣的情況時——我們需要一個比較復雜的對象,它的外觀(接口)我們是知道的,但是他的組成(各種各樣的組成)我們并不關心,而且他的構造過程(比如先后順序)我們也不關心——這時,我們就需要用到Builder模式了。
還是拿廣本來打比方。廣本的四個車間,最開頭的是沖壓科,而在沖壓科的門口有一間小房子,里面放了一臺激光焊接機,它用它的機械手臂抓起旁邊放著的各種各樣的鋼板,不停的焊接。可能有人要問,這是什么例子?這就是生成器!一般來說,汽車各處外殼的厚度以及硬度是不同的,比如車頭部分就要夠硬(用來撞的^_^),其他一些地方比如車頂就沒有必要用超厚的鋼板。這樣,一來可以降低整車的質量,可以省油;二來可以降低成本(所以廣本暴利啊~~其實其他汽車廠家也這么干)先前所講的焊接機就是干這個事情的,它將各種不同厚度不同硬度的鋼板焊接在一起,供那些巨型的沖壓機來沖壓成型,以生產汽車的各個不同的部分。各種汽車所使用的合成鋼板的組成是不一樣的,但沖壓機不管那么多,它只管壓鋼板。這樣一來就明白了吧?焊接機將各種鋼板按照規定焊接成不同組成的合成鋼板,至于它是如何焊接的以及合成鋼板的組成,沖壓機對這些信息是不關心的。
我們來看一個類圖。
?
?
這張簡單的類圖跟《設計模式》書中有顯著的不同。因為我主要是用來說明上面的例子的,跟書中提及的例子不同。這個圖中,焊接機由焊接程序控制,以生產不同規格的鋼板,沖壓機僅僅是調用焊接機的GetSteel方法來獲得焊好的鋼板。其實,這樣的情況在我們平時的程序中用得更多一些,即某一個類僅僅是要得到一個產品,而產品的一切信息它均不知曉。當我們需要另外一種規格的鋼板時,更換相應的程序就可以了。
在MS給我們的類庫中,有一個叫做StringBuilder的類,這就是一個例子。我們給它不同的字符串或是其他對象(這些就可以看作是原材料),根據我們輸入的順序(組裝過程),我們可以得到我們想要的一個字符串。
把這個類圖串換成代碼(這個代碼實在不怎么樣,還好,這只是一個說明,如果我在工作中寫出這樣的東西來,我就可以體驗一下從17樓飛下的感覺了,^_^)
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
????????}
????}
?
從類圖以及代碼實例中,我們看到Builder的一些優勢了。在我們需要不同的原料以生產不同的產品時,不用更改一大片的代碼,僅僅更改指導Builder工作的向導就可以了。在本例中,也就是更改焊接程序,根本不會有什么產品的抽象類。我們當然也可以實現一個Builder的父類,以實現更多的產品的制造。
生成器模式主要用的地方就是組合一些比較復雜的產品,而且這個產品的組合方式是多種多樣的。
回到目錄
上一篇:Abstract Factory
下一篇:Factory Method
總結
以上是生活随笔為你收集整理的白话设计模式——Builder的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 请专家帮我配一套适合油性皮肤的护肤品!要
- 下一篇: 一个asp.net2005的页面文件调用