理解軟件設(shè)計(jì)模式中的建造者模式
4個(gè)角色:指揮者(Director),建造者(Builder),具體建造者(ConcreteBuilder),產(chǎn)品(Product)
產(chǎn)品:需要?jiǎng)?chuàng)建的對(duì)象產(chǎn)品
具體建造者:創(chuàng)建產(chǎn)品的實(shí)例并且實(shí)現(xiàn)建造者多個(gè)方法對(duì)產(chǎn)品進(jìn)行裝配
建造者:本質(zhì)為抽象類,里面的抽象方法供具體建造者重寫,聲明產(chǎn)品的引用
指揮者:調(diào)用建造者抽象類以及其方法
實(shí)現(xiàn)思路:客戶端創(chuàng)建一個(gè)指揮者,并且實(shí)例化需要的產(chǎn)品的具體建造者,然后指揮者調(diào)用具體建造者的實(shí)例即將產(chǎn)品生產(chǎn)出來(lái)。
類圖:
應(yīng)用場(chǎng)景:在Silverlight中我們需要生產(chǎn)一列多行的輸入框+TextBlock的組合,但是這些輸入框的類型不同,有一些只能輸入256個(gè)字符,有的只能輸入20個(gè)字符,還有的是多行的,有的是單行的輸入框。這些輸入框的種類是固定的,但是可能用戶自定義輸入框的時(shí)候我們生成的順序和各自的生成數(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ù)量和是否多行是不定的,那么我們實(shí)現(xiàn)AConcreteBuilder,BConcreteBuilder,CConcreteBuilder,DConcreteBuilder,
EConcreteBuilder,FConcreteBuilder等多個(gè)具體建造者,然后對(duì)于建造者中只需要兩個(gè)方法分別實(shí)例化產(chǎn)品,并且對(duì)產(chǎn)品的屬性(可輸入字符數(shù)、是否可多行)進(jìn)行設(shè)置,然后再用戶需要調(diào)用什么產(chǎn)品的時(shí)候,使用指揮者調(diào)用想要的ConcreteBuilder具體建造者即可。
下面我們以一個(gè)電腦產(chǎn)品生產(chǎn)的實(shí)例來(lái)具體看看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)品實(shí)例///</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();
- }
- }
如需源碼請(qǐng)點(diǎn)擊 BuilderPattern.zip下載。
原文鏈接:http://www.cnblogs.com/chengxingliang/archive/2011/07/14/2105119.html
【編輯推薦】
- 新手軟件項(xiàng)目經(jīng)理該如何入門
- 項(xiàng)目經(jīng)理的力量應(yīng)該從哪里來(lái)?
- 當(dāng)你從程序員變?yōu)轫?xiàng)目經(jīng)理
- 軟件測(cè)試項(xiàng)目為什么會(huì)失敗
- 項(xiàng)目管理之CVS與SVN日常使用總結(jié)