第5章 建造者模式_第1頁
第5章 建造者模式_第2頁
第5章 建造者模式_第3頁
第5章 建造者模式_第4頁
第5章 建造者模式_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第第5章章 建造者模式建造者模式(Builder)(生成器模式)(生成器模式)導(dǎo)出數(shù)據(jù)的應(yīng)用框架導(dǎo)出數(shù)據(jù)的應(yīng)用框架對于導(dǎo)出數(shù)據(jù)的應(yīng)用框架,通常在導(dǎo)出數(shù)據(jù)對于導(dǎo)出數(shù)據(jù)的應(yīng)用框架,通常在導(dǎo)出數(shù)據(jù)上會有一些約定的方式,比如導(dǎo)出成:文本上會有一些約定的方式,比如導(dǎo)出成:文本格式、數(shù)據(jù)庫備份形式、格式、數(shù)據(jù)庫備份形式、Excel格式、格式、Xml格格式等等式等等假如現(xiàn)在有如下的要求:假如現(xiàn)在有如下的要求: 導(dǎo)出的文件,不管什么格式,都分成三個部分,分導(dǎo)出的文件,不管什么格式,都分成三個部分,分別是文件頭、文件體和文件尾別是文件頭、文件體和文件尾 在文件頭部分,需要描述如下信息:分公司或門市在文件頭部分,

2、需要描述如下信息:分公司或門市點編號、導(dǎo)出數(shù)據(jù)的日期,對于文本格式,中間用點編號、導(dǎo)出數(shù)據(jù)的日期,對于文本格式,中間用逗號分隔逗號分隔 在文件體部分,需要描述如下信息:表名稱、然后在文件體部分,需要描述如下信息:表名稱、然后分條描述數(shù)據(jù)。對于文本格式,表名稱單獨占一行,分條描述數(shù)據(jù)。對于文本格式,表名稱單獨占一行,數(shù)據(jù)描述一行算一條數(shù)據(jù),字段間用逗號分隔。數(shù)據(jù)描述一行算一條數(shù)據(jù),字段間用逗號分隔。 在文件尾部分,需要描述如下信息:輸出人在文件尾部分,需要描述如下信息:輸出人不用模式的解決方案不用模式的解決方案不管是輸出成文本文件,還是輸出到不管是輸出成文本文件,還是輸出到XML文件,文件,在實

3、現(xiàn)的時候,步驟基本上都是一樣的,都大在實現(xiàn)的時候,步驟基本上都是一樣的,都大致分成了如下四步:致分成了如下四步: 先拼接文件頭的內(nèi)容先拼接文件頭的內(nèi)容 然后拼接文件體的內(nèi)容然后拼接文件體的內(nèi)容 再拼接文件尾的內(nèi)容再拼接文件尾的內(nèi)容 最后把拼接好的內(nèi)容輸出出去成為文件最后把拼接好的內(nèi)容輸出出去成為文件存在問題存在問題1)構(gòu)建每種輸出格式的文件內(nèi)容的時候,都)構(gòu)建每種輸出格式的文件內(nèi)容的時候,都會重復(fù)這幾個處理步驟,應(yīng)該提煉出來,形會重復(fù)這幾個處理步驟,應(yīng)該提煉出來,形成公共的處理過程成公共的處理過程2)今后可能會有很多不同輸出格式的要求,)今后可能會有很多不同輸出格式的要求,這就需要在處理過程不

4、變的情況下,能方便這就需要在處理過程不變的情況下,能方便的切換不同的輸出格式的處理的切換不同的輸出格式的處理解決思路及方案解決思路及方案 構(gòu)建每種格式的數(shù)據(jù)文件的構(gòu)建每種格式的數(shù)據(jù)文件的處理處理過程,應(yīng)過程,應(yīng)該和具體的步驟該和具體的步驟實現(xiàn)實現(xiàn)分開,這樣就能夠復(fù)分開,這樣就能夠復(fù)用處理過程,而且能很容易的切換不同的用處理過程,而且能很容易的切換不同的輸出格式輸出格式 建造者模式建造者模式建造者模式建造者模式 構(gòu)建過程獨立出來,建造者模式中把它稱構(gòu)建過程獨立出來,建造者模式中把它稱為為指導(dǎo)者指導(dǎo)者,由它來指導(dǎo)裝配過程,但是不,由它來指導(dǎo)裝配過程,但是不負責(zé)每步具體的實現(xiàn)負責(zé)每步具體的實現(xiàn) 具體

5、實現(xiàn)每步的對象,在建造者模式中稱具體實現(xiàn)每步的對象,在建造者模式中稱這些實現(xiàn)對象為這些實現(xiàn)對象為建造者建造者(生成器)(生成器)建造者模式建造者模式UML類圖類圖產(chǎn)品(產(chǎn)品(Product)角色)角色:被構(gòu)建的復(fù)雜對象,包含多個組:被構(gòu)建的復(fù)雜對象,包含多個組成部件成部件建造者(建造者(Builder)角色)角色:定義創(chuàng)建一個:定義創(chuàng)建一個Product對象所需對象所需的各個部件的操作接口,該接口中一般聲明兩類方法,一的各個部件的操作接口,該接口中一般聲明兩類方法,一類方法是類方法是buildPartX(),它們用于創(chuàng)建復(fù)雜對象的各個部,它們用于創(chuàng)建復(fù)雜對象的各個部件;另一類方法是件;另一類方

6、法是getResult(),它們用于返回復(fù)雜對象,它們用于返回復(fù)雜對象具體建造者(具體建造者(Concrete Builder)角色)角色:實現(xiàn)了:實現(xiàn)了Builder接接口,實現(xiàn)各個部件的具體構(gòu)造和裝配方法,定義并明確它口,實現(xiàn)各個部件的具體構(gòu)造和裝配方法,定義并明確它所創(chuàng)建的復(fù)雜對象,也可以提供一個方法返回創(chuàng)建好的復(fù)所創(chuàng)建的復(fù)雜對象,也可以提供一個方法返回創(chuàng)建好的復(fù)雜產(chǎn)品對象雜產(chǎn)品對象指揮者(指揮者(Director)角色)角色:又稱為導(dǎo)演類,它負責(zé)安:又稱為導(dǎo)演類,它負責(zé)安排復(fù)雜對象的建造次序,指揮者與抽象建造者之間存排復(fù)雜對象的建造次序,指揮者與抽象建造者之間存在在關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系,可

7、以在其,可以在其construct()建造方法中調(diào)用建建造方法中調(diào)用建造者對象的部件構(gòu)造與裝配方法,完成復(fù)雜對象的建造者對象的部件構(gòu)造與裝配方法,完成復(fù)雜對象的建造。造??蛻舳艘话阒恍枰c指揮者進行交互,在客戶端確定客戶端一般只需要與指揮者進行交互,在客戶端確定具體建造者的類型,并實例化具體建造者對象(也可具體建造者的類型,并實例化具體建造者對象(也可以通過配置文件和反射機制),然后通過指揮者類的以通過配置文件和反射機制),然后通過指揮者類的構(gòu)造函數(shù)或者構(gòu)造函數(shù)或者Setter方法將該對象傳入指導(dǎo)者類中方法將該對象傳入指導(dǎo)者類中/建造者的接口定義建造者的接口定義public interface

8、 Builder public void buildPart();建造者模式示例代碼建造者模式示例代碼/具體的建造者的實現(xiàn)具體的建造者的實現(xiàn)public class ConcreteBuilder implements Builder private Product resultProduct; /獲取生成器最終構(gòu)建的產(chǎn)品對象獲取生成器最終構(gòu)建的產(chǎn)品對象 public Product getResult() return resultProduct; public void buildPart() /構(gòu)建某個部件的功能處理構(gòu)建某個部件的功能處理 /被構(gòu)建的產(chǎn)品對象的接口被構(gòu)建的產(chǎn)品對象的接口p

9、ublic interface Product /定義產(chǎn)品的操作定義產(chǎn)品的操作/指導(dǎo)者指導(dǎo)者public class Director private Builder builder; public Director(Builder builder) this.builder = builder; public void construct() /通過使用生成器接口來構(gòu)建最終的產(chǎn)品對象通過使用生成器接口來構(gòu)建最終的產(chǎn)品對象 builder.buildPart(); 示示 例例 /產(chǎn)品(產(chǎn)品(Product)角色)角色public class Vehicle protected String m

10、_strType; protected String m_strFrame; protected String m_strEngine; protected String m_strWheels; protected String m_strDoors; Vehicle(String strType) m_strType = strType; public void Show() System.out.println(-); System.out.println(Vehicle type:+m_strType); System.out.println(Frame:+m_strFrame); S

11、ystem.out.println(Engine:+m_strEngine); System.out.println(Wheels:+m_strWheels); System.out.println(Doors:+m_strDoors); /抽象建造者(抽象建造者(Builder)角色)角色public abstract class VehicleBuilder protected Vehicle vehicle; public Vehicle GetResult() return vehicle; public abstract void BuildFrame(); public abstr

12、act void BuildEngine(); public abstract void BuildWheels(); public abstract void BuildDoors();/具體建造者(具體建造者(Concrete Builder)角色)角色public class MotorBuilder extends VehicleBuilder public void BuildFrame() vehicle = new Vehicle(MotorCycle); vehicle.m_strFrame = MotorCycle Frame; public void BuildEngine

13、() vehicle.m_strEngine = 500 cc; public void BuildWheels() vehicle.m_strWheels = 2 wheels; public void BuildDoors() vehicle.m_strDoors = no doors; /具體建造者(具體建造者(Concrete Builder)角色)角色public class CarBuilder extends VehicleBuilder public void BuildFrame() vehicle = new Vehicle(Car); vehicle.m_strFrame

14、 = Car Frame; public void BuildEngine() vehicle.m_strEngine = 2500 cc; public void BuildWheels() vehicle.m_strWheels = 4 wheels; public void BuildDoors() vehicle.m_strDoors = 4 doors; /指導(dǎo)者(指導(dǎo)者(Director)角色)角色public class Shop public void Construct(VehicleBuilder vehicleBuilder ) vehicleBuilder.BuildF

15、rame(); vehicleBuilder.BuildEngine(); vehicleBuilder.BuildWheels(); vehicleBuilder.BuildDoors(); import VehicleShop.Shop;import VehicleShop.CarBuilder;import VehicleShop.Vehicle;public class Client public static void main(String args) Shop shop = new Shop(); CarBuilder builder = new CarBuilder(); sh

16、op.Construct(builder); Vehicle v = builder.GetResult(); v.Show(); 快餐店制作兒童餐快餐店制作兒童餐典型的兒童餐包括一個主食,一個輔食,一杯典型的兒童餐包括一個主食,一個輔食,一杯飲料和一個玩具飲料和一個玩具組合成兒童餐的過程:無論顧客點的是漢堡,組合成兒童餐的過程:無論顧客點的是漢堡,三名治還是雞肉,過程都是一樣的。三名治還是雞肉,過程都是一樣的。 柜臺的員工直接把主食,輔食和玩具放在一柜臺的員工直接把主食,輔食和玩具放在一個袋子中。飲料被倒入杯中,放在袋子外邊。個袋子中。飲料被倒入杯中,放在袋子外邊??觳偷曛谱鲀和涂觳偷曛谱?/p>

17、兒童餐客戶端客戶端:顧客。想去買一套套餐(這里面包括漢堡,:顧客。想去買一套套餐(這里面包括漢堡,可樂,薯條),可以有可樂,薯條),可以有1號和號和2號兩種套餐供顧客選擇號兩種套餐供顧客選擇指導(dǎo)者角色指導(dǎo)者角色:收銀員。知道顧客想要買什么樣的套:收銀員。知道顧客想要買什么樣的套餐,并告訴餐館員工去準(zhǔn)備套餐。餐,并告訴餐館員工去準(zhǔn)備套餐。建造者角色建造者角色:餐館員工。按照收銀員的要求去準(zhǔn)備:餐館員工。按照收銀員的要求去準(zhǔn)備具體的套餐,分別放入漢堡,可樂,薯條等。具體的套餐,分別放入漢堡,可樂,薯條等。產(chǎn)品角色產(chǎn)品角色:最后的套餐,所有的東西放在同一個盤:最后的套餐,所有的東西放在同一個盤子里面

18、。子里面。使用生成器模式重寫導(dǎo)出數(shù)據(jù)的應(yīng)用框架使用生成器模式重寫導(dǎo)出數(shù)據(jù)的應(yīng)用框架JDKDocumentBuilderFactory StringBufferStringBuilder建造者模式的演化建造者模式的演化 1、省略抽象建造者角色省略抽象建造者角色 如果系統(tǒng)中只需要一個具體建造者的話,可以省略如果系統(tǒng)中只需要一個具體建造者的話,可以省略掉抽象建造者掉抽象建造者 建造者模式的演化建造者模式的演化 1、省略抽象建造者角色省略抽象建造者角色public class Director private ConcreteBuilder builder; / Methods public void

19、 Construct() builder.BuildPartA(); builder.BuildPartB(); 2、省略指導(dǎo)者角色省略指導(dǎo)者角色 在具體建造者只有一個的情況下,如果抽象建造者角色已經(jīng)在具體建造者只有一個的情況下,如果抽象建造者角色已經(jīng)被省略掉,那么還可以省略掉指導(dǎo)者角色。讓被省略掉,那么還可以省略掉指導(dǎo)者角色。讓Builder角色角色自己扮演指導(dǎo)者與建造者雙重角色。自己扮演指導(dǎo)者與建造者雙重角色。 2、省略指導(dǎo)者角色省略指導(dǎo)者角色public class Builder private Product product = new Product(); public void

20、BuildPartA() /Some code here public void BuildPartB() /Some code here public Product GetResult() return product; public void Construct() BuildPartA(); BuildPartB(); 建造者模式優(yōu)點建造者模式優(yōu)點 在建造者模式中,在建造者模式中,客戶端不必知道產(chǎn)品內(nèi)部組客戶端不必知道產(chǎn)品內(nèi)部組成的細節(jié),成的細節(jié),將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象。使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)

21、品對象。 每一個具體建造者都相對獨立,而與其他的具每一個具體建造者都相對獨立,而與其他的具體建造者無關(guān),因此可以很方便地替換具體建體建造者無關(guān),因此可以很方便地替換具體建造者或增加新的具體建造者,造者或增加新的具體建造者,用戶使用不同的用戶使用不同的具體建造者即可得到不同的產(chǎn)品對象具體建造者即可得到不同的產(chǎn)品對象。建造者模式優(yōu)點建造者模式優(yōu)點可以更加精細地控制產(chǎn)品的創(chuàng)建過程??梢愿泳毜乜刂飘a(chǎn)品的創(chuàng)建過程。將復(fù)雜將復(fù)雜產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)產(chǎn)品的創(chuàng)建步驟分解在不同的方法中,使得創(chuàng)建過程更加清晰,也更方便使用程序來控制創(chuàng)建過程更加清晰,也更方便使用程序來控制創(chuàng)建過程。建過程。

22、增加新的具體建造者無須修改原有類庫的代碼,增加新的具體建造者無須修改原有類庫的代碼,指揮者類針對抽象建造者類編程,系統(tǒng)擴展方指揮者類針對抽象建造者類編程,系統(tǒng)擴展方便,符合便,符合“開閉原則開閉原則”。建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同建造者模式所創(chuàng)建的產(chǎn)品一般具有較多的共同點,其組成部分相似,如果產(chǎn)品之間的點,其組成部分相似,如果產(chǎn)品之間的差異性差異性很大很大,則,則不適合不適合使用建造者模式,因此其使用使用建造者模式,因此其使用范圍受到一定的限制。范圍受到一定的限制。如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會導(dǎo)致需要定如果產(chǎn)品的內(nèi)部變化復(fù)雜,可能會導(dǎo)致需要定義很多具體建造者類來實現(xiàn)這種變化,導(dǎo)致

23、系義很多具體建造者類來實現(xiàn)這種變化,導(dǎo)致系統(tǒng)變得很龐大。統(tǒng)變得很龐大。建造者模式缺點建造者模式缺點在什么情況下使用建造者模式在什么情況下使用建造者模式 需要生成的產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu)需要生成的產(chǎn)品對象有復(fù)雜的內(nèi)部結(jié)構(gòu),這些產(chǎn),這些產(chǎn)品對象通常包含多個成員屬性。品對象通常包含多個成員屬性。需要生成的產(chǎn)品對象的屬性相互依賴,需要指定需要生成的產(chǎn)品對象的屬性相互依賴,需要指定其生成順序其生成順序。對象的創(chuàng)建過程獨立于創(chuàng)建該對象的類對象的創(chuàng)建過程獨立于創(chuàng)建該對象的類。在建造。在建造者模式中引入了指揮者類,將創(chuàng)建過程封裝在指者模式中引入了指揮者類,將創(chuàng)建過程封裝在指揮者類中,而不在建造者類中。揮者類中,而不在建造者類中。隔離復(fù)雜對象的創(chuàng)建和使用,并使得相同的創(chuàng)建隔離復(fù)雜對象的創(chuàng)建和使用,并使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品。過程可以創(chuàng)建不同的產(chǎn)品。與抽

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論