理解軟件設(shè)計模式中的建造者模式
4個角色:指揮者(Director),建造者(Builder),具體建造者(ConcreteBuilder),產(chǎn)品(Product)
產(chǎn)品:需要創(chuàng)建的對象產(chǎn)品
具體建造者:創(chuàng)建產(chǎn)品的實例并且實現(xiàn)建造者多個方法對產(chǎn)品進行裝配
建造者:本質(zhì)為抽象類,里面的抽象方法供具體建造者重寫,聲明產(chǎn)品的引用
指揮者:調(diào)用建造者抽象類以及其方法
實現(xiàn)思路:客戶端創(chuàng)建一個指揮者,并且實例化需要的產(chǎn)品的具體建造者,然后指揮者調(diào)用具體建造者的實例即將產(chǎn)品生產(chǎn)出來。
類圖:
應(yīng)用場景:在Silverlight中我們需要生產(chǎn)一列多行的輸入框+TextBlock的組合,但是這些輸入框的類型不同,有一些只能輸入256個字符,有的只能輸入20個字符,還有的是多行的,有的是單行的輸入框。這些輸入框的種類是固定的,但是可能用戶自定義輸入框的時候我們生成的順序和各自的生成數(shù)量不知道。
分析:在這里產(chǎn)品是固定的,有A,B,C,D,E,F六種輸入框+TextBlock,用戶可能生成的情況是A,A,C,C,B,B,C、也可能是B,C,D,B,C,F。這里我們使用建造者模式,這幾種輸入框基本上都差不多,都是TextBlock+TextBox的模式。但是可輸入數(shù)量和是否多行是不定的,那么我們實現(xiàn)AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,
EConcreteBuilder,FConcreteBuilder等多個具體建造者,然后對于建造者中只需要兩個方法分別實例化產(chǎn)品,并且對產(chǎn)品的屬性(可輸入字符數(shù)、是否可多行)進行設(shè)置,然后再用戶需要調(diào)用什么產(chǎn)品的時候,使用指揮者調(diào)用想要的ConcreteBuilder具體建造者即可。
下面我們以一個電腦產(chǎn)品生產(chǎn)的實例來具體看看Builder Pattern是如何使用的:
一、產(chǎn)品角色
- //產(chǎn)品
- classComputer
- {privatestringm_CompName;privatestringm_MemorySize;privatestringm_DiskSize;///<summary>
- ///電腦名稱///</summary>
- publicstringCompName
- {get{ returnm_CompName; }set{ m_CompName =value; }
- }///<summary>
- ///內(nèi)存大小///</summary>
- publicstringMemorySize
- {get{ returnm_MemorySize; }set{ m_MemorySize =value; }
- }///<summary>
- ///硬盤大小///</summary>
- publicstringDiskSize
- {get{ returnm_DiskSize; }set{ m_DiskSize =value; }
- }///<summary>
- ///顯示產(chǎn)品的信息///</summary>
- publicvoidShowComputerInfo()
- {
- Console.WriteLine("------------------------");
- Console.WriteLine("電腦名稱:"+CompName);
- Console.WriteLine("內(nèi)存大?。?quot;+MemorySize);
- Console.WriteLine("硬盤大?。?quot;+DiskSize);
- }
- }
二、建造者角色
- //建造者 定義建造產(chǎn)品的抽象方法和產(chǎn)品的引用
- abstractclassComputerBuilder
- {privateComputer computerInstance;///<summary>
- ///返回建立的電腦產(chǎn)品實例///</summary>
- publicComputer ComputerInstance
- {get{ returncomputerInstance; }set{ computerInstance=value; }
- }///<summary>
- ///創(chuàng)建電腦名稱///</summary>
- abstractpublicvoidCreateCompName();///<summary>
- ///創(chuàng)建電腦內(nèi)存///</summary>
- abstractpublicvoidCreateCompMemory();///<summary>
- ///創(chuàng)建電腦硬盤///</summary>
- abstractpublicvoidCreateCompDisk();
- }
三、具體建造者角色
- //具體建造者創(chuàng)建蘋果電腦
- classAppleConcreteBuilder : ComputerBuilder
- {publicoverridevoidCreateCompName()
- {
- ComputerInstance =newComputer();
- ComputerInstance.CompName ="蘋果電腦"}publicoverridevoidCreateCompMemory()
- {
- ComputerInstance.MemorySize ="4G"}publicoverridevoidCreateCompDisk()
- {
- ComputerInstance.DiskSize ="500G"}
- }//具體建造者創(chuàng)建戴爾電腦
- classDellConcreteBuilder : ComputerBuilder
- {publicoverridevoidCreateCompName()
- {
- ComputerInstance =newComputer();
- ComputerInstance.CompName ="戴爾電腦"}publicoverridevoidCreateCompMemory()
- {
- ComputerInstance.MemorySize ="2GB"}publicoverridevoidCreateCompDisk()
- {
- ComputerInstance.DiskSize ="320GB"}
- }//具體建造者創(chuàng)建惠普電腦
- classHpConcreteBuilder : ComputerBuilder
- {publicoverridevoidCreateCompName()
- {
- ComputerInstance =newComputer();
- ComputerInstance.CompName ="惠普電腦"}publicoverridevoidCreateCompMemory()
- {
- ComputerInstance.MemorySize ="1GB"}publicoverridevoidCreateCompDisk()
- {
- ComputerInstance.DiskSize ="160GB"}
- }//具體建造者創(chuàng)建IBM電腦
- classIBMConcreteBuilder : ComputerBuilder
- {publicoverridevoidCreateCompName()
- {
- ComputerInstance =newComputer();
- ComputerInstance.CompName ="IBM電腦"}publicoverridevoidCreateCompMemory()
- {
- ComputerInstance.MemorySize ="2G"}publicoverridevoidCreateCompDisk()
- {
- ComputerInstance.DiskSize ="1000G"}
- }
四、指揮者角色
- //指揮者
- classCreateDirector
- {///<summary>
- ///調(diào)用建造者抽象方法以生產(chǎn)產(chǎn)品///</summary>
- ///<param name="compBuilder"></param>
- publicvoidCreateComputer(ComputerBuilder compBuilder)
- {
- compBuilder.CreateCompName();
- compBuilder.CreateCompMemory();
- compBuilder.CreateCompDisk();
- }
- }
如需源碼請點擊 BuilderPattern.zip下載。
原文鏈接:http://www.cnblogs.com/chengxingliang/archive/2011/07/14/2105119.html
【編輯推薦】
- 新手軟件項目經(jīng)理該如何入門
- 項目經(jīng)理的力量應(yīng)該從哪里來?
- 當你從程序員變?yōu)轫椖拷?jīng)理
- 軟件測試項目為什么會失敗
- 項目管理之CVS與SVN日常使用總結(jié)