我的设计模式之旅(4)——生成器(建造者)模式Builder
Builder模式也是創建型模式中的一種。主要用來應對構成復雜但構成結構和順序相對穩定的對象的創建工作。目的是省去在對象發生變化時,需要修改代碼中每一處對象創建的地方,應用這種模式,可以在一個復雜對象的內部結構(由許多其他子對象構成的結構)發生變化時,僅需要對對象有所修改,而復雜對象與其他的對象之間的關系、行為不需要進行修改。
其實這就是這個創建型模式應用的動機:在軟件系統中,有時面臨著一個復雜對象的創建工作,其通常由各個部分的子對象用一定的算法構成;由于需求的變化,這個復雜對象的各個部分經常面臨著劇烈的變化,但是將它們組合在一起的算法卻相對穩定。
GOF:
將一個復雜對象的構建與其表示相分離,使得同樣的構建過程可以創建不同的表示。
下面舉一個例子,來說明這種應用,比如說買電腦中的裝機,根據消費者不同的需求,我們要提供不同品牌不同配置的電腦。
裝機器就像Builder模式描述的一樣,組裝成機器的方法(即用子對象構建對象的算法)是穩定的,但是根據客戶的需求可能對機器現有配置要求升級,則只是子對象發生了變化,但是這不影響極其的組裝方法。
定義組裝成電腦需要的設備,這里為了代碼量少一些,簡化了電腦的構建,粗略的分為CPU、主板、內存、硬盤、鍵盤、鼠標。首先構建它們對應的抽象類。
???? // 電腦
???? public abstract class Computer
???? {
???? }
?
???? // CPU
???? public abstract class CPU
???? {
???? }
???? // 主板
???? public abstract class Mainboard
???? {
???? }
???? // 內存
???? public abstract class Memory
???? {
???? }
???? // 硬盤
???? public abstract class Harddisk
???? {
???? }
???? // 鍵盤
???? public abstract class Keyboard
???? {
???? }
???? // 鼠標
???? public abstract class Mouse
???? {
???? }
然后,就可以定義構建組裝電腦需要的配件的抽象方法。
???? public abstract class ComputerBuilder
???? {
???????? public abstract void BuildCPU();
???????? public abstract void BuildMainboard();
???????? public abstract void BuildMemory();
???????? public abstract void BuildHarddisk();
???????? public abstract void BuildKeyboard();
???????? public abstract void BuildMouse();
?
???????? public abstract Computer GetComputer();
???? }
這里僅提供了一種品牌機的標準配置IBM。這時就可以來構建我們實際需要的IBM配件(實際子對象)了。
???? // IBM電腦
???? public class IBMComputer : Computer
???? {
???? }
?
???? // IBMCPU
???? public class IBMCPU : CPU
???? {
???? }
???? // IBM主板
???? public class IBMMainboard : Mainboard
???? {
???? }
???? // IBM內存
???? public class IBMMemory : Memory
???? {
???? }
???? // IBM硬盤
???? public class IBMHarddisk : Harddisk
???? {
???? }
???? // IBM鍵盤
???? public class IBMKeyboard : Keyboard
???? {
???? }
???? // IBM鼠標
???? public class IBMMouse : Mouse
???? {
???? }
到這里我們就需要定義,組裝IBM配件的方法了。為了簡單,這里又定義了一個用來存儲實際需要的配件集合,用來存儲我們構建出來的配件(子對象)。
???? public class AssemblyComputer
???? {
???????? // 組裝起來的電腦配件
???????? ArrayList accessories = new ArrayList();
?
???????? public void Add(string part)
???????? {
????????????? accessories.Add(part);
???????? }
?
???????? public void ShowDetails ()
???????? {
????????????? Console.WriteLine( "Computer Accessories: " );
?
????????????? foreach(string part in accessories)
?????????????????? Console.WriteLine(part);
???????? }
???? }
這時我們的ComputerBuilder方法和集成自它的實際構建方法IBMComputerBuilder就需要有所修改,返回一個我們建立的輔助信息存儲類型的對象AssemblyComputer。以下為修改后的IBM電腦子對象構建類。
???? public class IBMComputerBuilder : ComputerBuilder
???? {
???????? AssemblyComputer ac = new AssemblyComputer();
?
???????? public override void BuildCPU()
???????? {
????????????? ac.Add("IBMCPU");
???????? }
???????? public override void BuildMainboard()
???????? {
????????????? ac.Add("IBMMainboard");
???????? }
???????? public override void BuildMemory()
???????? {
????????????? ac.Add("IBMMemory");
???????? }
???????? public override void BuildHarddisk()
???????? {
????????????? ac.Add("IBMHarddisk");
???????? }
???????? public override void BuildKeyboard()
???????? {
????????????? ac.Add("IBMKeyboard");
???????? }
???????? public override void BuildMouse()
???????? {
????????????? ac.Add("IBMMouse");
???????? }
?
???????? public override AssemblyComputer GetComputer()
???????? {
????????????? return ac;
???????? }
???? }
相應的抽象類也做修改。
???? public abstract class ComputerBuilder
???? {
???????? public abstract void BuildCPU();
???????? public abstract void BuildMainboard();
???????? public abstract void BuildMemory();
???????? public abstract void BuildHarddisk();
???????? public abstract void BuildKeyboard();
???????? public abstract void BuildMouse();
?
???????? public abstract AssemblyComputer GetComputer();
???? }
最后,我們定這個電腦的配置類,就是這臺電腦的實際配置。
???? public class ComputerConfiguration
???? {
???????? public static AssemblyComputer CreateComputer(ComputerBuilder computerbuilder)
???????? {
????????????? computerbuilder.BuildCPU();
????????????? computerbuilder.BuildMainboard();
????????????? computerbuilder.BuildMemory();
????????????? computerbuilder.BuildHarddisk();
????????????? computerbuilder.BuildKeyboard();
????????????? computerbuilder.BuildMouse();
?
????????????? return computerbuilder.GetComputer();
???????? }
???? }
其中的CreateComputer方法就是構建了一個電腦的實際配置例子。這里有一點需要強調的就是,這臺電腦需要的配件是穩定的,需要CPU、主板、內存、硬盤、鍵盤、鼠標。至于具體需要什么牌子的,很可能客戶就不要IBM的鍵盤鼠標,而需要一套羅技的鍵盤和鼠標,這時只要修改我們IBM的構建類,或者是添加一個新的自定義電腦配置類,然后在這個自定義構建類中定義我們需要的具體配件,而這些配件(子對象)構建出來的電腦對象的構建過程是不變的。
這樣,我們在客戶程序中使用定義好的對象時可以使用下面的代碼。
???? AssemblyComputer ac = ComputerConfiguration.CreateComputer(new IBMComputerBuilder());
???? ac.ShowDetails();
???? Console.ReadLine();
首先定一個電腦配置,然后使用一個需要的配置的生成器,最后將電腦配置呈現出來。
得到執行結果:
Computer Accessories:
IBMCPU
IBMMainboard
IBMMemory
IBMHarddisk
IBMKeyboard
IBMMouse
?
看到這段代碼可能大家還是感覺有新的配置后在維護的時候仍然需要修改new IBMComputerBuilder()這里,我們可以使用反射機制來解決這種問題,這樣就解決了擴展上不許重新進行編譯的問題。如果以前的有所修改那就直接替換掉相應的DLL程序集就可以了。方便了以后的維護擴展工作。
?
?
轉載于:https://www.cnblogs.com/Bear-Study-Hard/archive/2006/10/24/538606.html
總結
以上是生活随笔為你收集整理的我的设计模式之旅(4)——生成器(建造者)模式Builder的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP调试之保持连接状态(微软知识库文
- 下一篇: [导入]创建、查询、修改带名称空间的 X