




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第5章,工廠方法模式,劉 偉 weiliu_,本章教學(xué)內(nèi)容,工廠方法模式 模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析 模式實(shí)例與解析 模式效果與應(yīng)用 模式擴(kuò)展,工廠方法模式,簡(jiǎn)單工廠模式的不足 在簡(jiǎn)單工廠模式中,只提供了一個(gè)工廠類,該工廠類處于對(duì)產(chǎn)品類進(jìn)行實(shí)例化的中心位置,它知道每一個(gè)產(chǎn)品對(duì)象的創(chuàng)建細(xì)節(jié),并決定何時(shí)實(shí)例化哪一個(gè)產(chǎn)品類。簡(jiǎn)單工廠模式最大的缺點(diǎn)是當(dāng)有新產(chǎn)品要加入到系統(tǒng)中時(shí),必須修改工廠類,加入必要的處理邏輯,這違背了“開閉原則”。在簡(jiǎn)單工廠模式中,所有的產(chǎn)品都是由同一個(gè)工廠創(chuàng)建,工廠類職責(zé)較重,業(yè)務(wù)邏輯較為復(fù)雜,具體產(chǎn)品與工廠類之間的耦合度高,嚴(yán)重影響了系統(tǒng)的靈活性和擴(kuò)展性,而工廠方法模式則可
2、以很好地解決這一問題。,工廠方法模式,模式動(dòng)機(jī) 考慮這樣一個(gè)系統(tǒng),按鈕工廠類可以返回一個(gè)具體的按鈕實(shí)例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個(gè)系統(tǒng)中,如果需要增加一種新類型的按鈕,如橢圓形按鈕,那么除了增加一個(gè)新的具體產(chǎn)品類之外,還需要修改工廠類的代碼,這就使得整個(gè)設(shè)計(jì)在一定程度上違反了“開閉原則”。,工廠方法模式,模式動(dòng)機(jī) 現(xiàn)在對(duì)該系統(tǒng)進(jìn)行修改,不再設(shè)計(jì)一個(gè)按鈕工廠類來統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過程交給專門的工廠子類去完成,我們先定義一個(gè)抽象的按鈕工廠類,再定義具體的工廠類來生成圓形按鈕、矩形按鈕、菱形按鈕等,它們實(shí)現(xiàn)在抽象按鈕工廠類中定義的方法。這種抽象化的結(jié)果使這種結(jié)
3、構(gòu)可以在不修改具體工廠類的情況下引進(jìn)新的產(chǎn)品,如果出現(xiàn)新的按鈕類型,只需要為這種新類型的按鈕創(chuàng)建一個(gè)具體的工廠類就可以獲得該新按鈕的實(shí)例,這一特點(diǎn)無疑使得工廠方法模式具有超越簡(jiǎn)單工廠模式的優(yōu)越性,更加符合“開閉原則”。,工廠方法模式,模式動(dòng)機(jī) 使用工廠方法模式設(shè)計(jì)的按鈕工廠,工廠方法模式,模式定義 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生成具體的
4、產(chǎn)品對(duì)象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。,工廠方法模式,模式定義 Factory Method Pattern: Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses. Frequency of use: high,工廠方法模式,模式結(jié)構(gòu),工廠方法模式,模
5、式結(jié)構(gòu) 工廠方法模式包含如下角色: Product:抽象產(chǎn)品 ConcreteProduct:具體產(chǎn)品 Factory:抽象工廠 ConcreteFactory:具體工廠,工廠方法模式,模式分析 工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個(gè)核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)哪一個(gè)產(chǎn)品類被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。,工廠方法模式,模式分析 當(dāng)系統(tǒng)擴(kuò)展
6、需要添加新的產(chǎn)品對(duì)象時(shí),僅僅需要添加一個(gè)具體產(chǎn)品對(duì)象以及一個(gè)具體工廠對(duì)象,原有工廠對(duì)象不需要進(jìn)行任何修改,也不需要修改客戶端,很好地符合了“開閉原則”。而簡(jiǎn)單工廠模式在添加新產(chǎn)品對(duì)象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡(jiǎn)單工廠模式。,工廠方法模式,模式分析 抽象工廠類代碼:,抽象工廠類,工廠方法模式,模式分析 具體工廠類代碼:,具體工廠類,工廠方法模式,模式分析 客戶類代碼片段: 為了提高系統(tǒng)的可擴(kuò)展性和靈活性,在定義工廠和產(chǎn)品時(shí)都必須使用抽象層,如果需要更換產(chǎn)品類,只需要更換對(duì)應(yīng)的工廠即可,其他代碼不需要進(jìn)行任何修改。,工廠方法模式,模式分析 配置文件代碼: 在實(shí)際
7、的應(yīng)用開發(fā)中,一般將具體工廠類的實(shí)例化過程進(jìn)行改進(jìn),不直接使用new關(guān)鍵字來創(chuàng)建對(duì)象,而是將具體類的類名寫入配置文件中,再通過Java的反射機(jī)制,讀取XML格式的配置文件,根據(jù)存儲(chǔ)在XML文件中的類名字符串生成對(duì)象。,工廠方法模式,模式分析 Java反射(Java Reflection): 是指在程序運(yùn)行時(shí)獲取已知名稱的類或已有對(duì)象的相關(guān)信息的一種機(jī)制,包括類的方法、屬性、超類等信息,還包括實(shí)例的創(chuàng)建和實(shí)例類型的判斷等??赏ㄟ^Class類的forName()方法返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的Class對(duì)象,再通過newInstance()方法創(chuàng)建此對(duì)象所表示的類的一個(gè)新實(shí)例,即通過一
8、個(gè)類名字符串得到類的實(shí)例。,工廠方法模式,模式分析 工具類XMLUtil代碼片段:,工廠方法模式,模式分析 修改后的客戶類代碼片段:,工廠方法模式,模式實(shí)例與解析 實(shí)例一:電視機(jī)工廠 將原有的工廠進(jìn)行分割,為每種品牌的電視機(jī)提供一個(gè)子工廠,海爾工廠專門負(fù)責(zé)生產(chǎn)海爾電視機(jī),海信工廠專門負(fù)責(zé)生產(chǎn)海信電視機(jī),如果需要生產(chǎn)TCL電視機(jī)或創(chuàng)維電視機(jī),只需要對(duì)應(yīng)增加一個(gè)新的TCL工廠或創(chuàng)維工廠即可,原有的工廠無須做任何修改,使得整個(gè)系統(tǒng)具有更加的靈活性和可擴(kuò)展性。,工廠方法模式,模式實(shí)例與解析 實(shí)例一:電視機(jī)工廠,工廠方法模式,模式實(shí)例與解析 實(shí)例一:電視機(jī)工廠 參考代碼(Chapter 05 Facto
9、ry Methodsample01),演示,工廠方法模式,模式實(shí)例與解析 實(shí)例二:日志記錄器 某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄、數(shù)據(jù)庫(kù)記錄等,且用戶可以根據(jù)要求動(dòng)態(tài)選擇日志記錄方式,現(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng)。,工廠方法模式,模式實(shí)例與解析 實(shí)例二:日志記錄器,工廠方法模式,模式優(yōu)缺點(diǎn) 工廠方法模式的優(yōu)點(diǎn) 在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類將被實(shí)例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對(duì)應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。 基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)
10、建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類都具有同一抽象父類。 使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時(shí),無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開閉原則”。,工廠方法模式,模式優(yōu)缺點(diǎn) 工廠方法模式的缺點(diǎn) 在添加新產(chǎn)品時(shí),需要編寫新的具體產(chǎn)品類,而且還要提供與之對(duì)應(yīng)的具體工廠類,系統(tǒng)中類的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運(yùn)行,會(huì)
11、給系統(tǒng)帶來一些額外的開銷。 由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度。,工廠方法模式,模式適用環(huán)境 在以下情況下可以使用工廠方法模式: 一個(gè)類不知道它所需要的對(duì)象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名,只需要知道所對(duì)應(yīng)的工廠即可,具體的產(chǎn)品對(duì)象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類。 一個(gè)類通過其子類來指定創(chuàng)建哪個(gè)對(duì)象:在工廠方法模式中,對(duì)于抽象工廠類只需要提供一個(gè)創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要?jiǎng)?chuàng)建的對(duì)象,利用面向?qū)ο蟮亩鄳B(tài)性
12、和里氏代換原則,在程序運(yùn)行時(shí),子類對(duì)象將覆蓋父類對(duì)象,從而使得系統(tǒng)更容易擴(kuò)展。 將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠子類中的某一個(gè),客戶端在使用時(shí)可以無須關(guān)心是哪一個(gè)工廠子類創(chuàng)建產(chǎn)品子類,需要時(shí)再動(dòng)態(tài)指定,可將具體工廠類的類名存儲(chǔ)在配置文件或數(shù)據(jù)庫(kù)中。,工廠方法模式,模式應(yīng)用 (1) java.util.Collection接口的iterator()方法:,工廠方法模式,模式應(yīng)用 (2) Java消息服務(wù)JMS(Java Messaging Service) :,工廠方法模式,模式應(yīng)用 (3) JDBC中的工廠方法:,工廠方法模式,模式擴(kuò)展 使用多個(gè)工廠方法:在抽象工廠角色中可以定義多個(gè)工廠方法,從
13、而使具體工廠角色實(shí)現(xiàn)這些不同的工廠方法,這些方法可以包含不同的業(yè)務(wù)邏輯,以滿足對(duì)不同的產(chǎn)品對(duì)象的需求。 產(chǎn)品對(duì)象的重復(fù)使用:工廠對(duì)象將已經(jīng)創(chuàng)建過的產(chǎn)品保存到一個(gè)集合(如數(shù)組、List等)中,然后根據(jù)客戶對(duì)產(chǎn)品的請(qǐng)求,對(duì)集合進(jìn)行查詢。如果有滿足要求的產(chǎn)品對(duì)象,就直接將該產(chǎn)品返回客戶端;如果集合中沒有這樣的產(chǎn)品對(duì)象,那么就創(chuàng)建一個(gè)新的滿足要求的產(chǎn)品對(duì)象,然后將這個(gè)對(duì)象在增加到集合中,再返回給客戶端。 多態(tài)性的喪失和模式的退化:如果工廠僅僅返回一個(gè)具體產(chǎn)品對(duì)象,便違背了工廠方法的用意,發(fā)生退化,此時(shí)就不再是工廠方法模式了。一般來說,工廠對(duì)象應(yīng)當(dāng)有一個(gè)抽象的父類型,如果工廠等級(jí)結(jié)構(gòu)中只有一個(gè)具體工廠類
14、的話,抽象工廠就可以省略,也將發(fā)生了退化。當(dāng)只有一個(gè)具體工廠,在具體工廠中可以創(chuàng)建所有的產(chǎn)品對(duì)象,并且工廠方法設(shè)計(jì)為靜態(tài)方法時(shí),工廠方法模式就退化成簡(jiǎn)單工廠模式。,本章小結(jié),工廠方法模式又稱為工廠模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象,這樣做的目的是將產(chǎn)品類的實(shí)例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類。 工廠方法模式包含四個(gè)角色:抽象產(chǎn)品是定義產(chǎn)品的接口,是工廠方法模式所創(chuàng)建對(duì)象的超類型,即產(chǎn)品對(duì)象的共同父類或接口;具體產(chǎn)品實(shí)現(xiàn)了抽象產(chǎn)品接口,某種類型的具體產(chǎn)品由專門的具體工
15、廠創(chuàng)建,它們之間往往一一對(duì)應(yīng);抽象工廠中聲明了工廠方法,用于返回一個(gè)產(chǎn)品,它是工廠方法模式的核心,任何在模式中創(chuàng)建對(duì)象的工廠類都必須實(shí)現(xiàn)該接口;具體工廠是抽象工廠類的子類,實(shí)現(xiàn)了抽象工廠中定義的工廠方法,并可由客戶調(diào)用,返回一個(gè)具體產(chǎn)品類的實(shí)例。,本章小結(jié),工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個(gè)核心類僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)產(chǎn)品類被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租光伏平房合同范本
- 衛(wèi)生院聘用合同范本
- 《讓世界充滿愛》教案設(shè)計(jì)
- 儲(chǔ)氣庫(kù)鉆井招投標(biāo)合同范本
- 勞動(dòng)仲裁律師合同范本
- 印刷及設(shè)計(jì)合同范本
- 《春日偶成》教學(xué)反思
- 《恐龍的滅絕》教案
- 全款購(gòu)機(jī)合同范本
- 保利員工合同范本
- 綠色簡(jiǎn)約墻體商務(wù)風(fēng)PPT模板
- GB/T 462-2003紙和紙板水分的測(cè)定
- QC演示:提高檢查井周邊密實(shí)度
- 湖南美術(shù)出版社五年級(jí)下冊(cè)書法練習(xí)指導(dǎo)
- 年度應(yīng)急演練計(jì)劃表
- 英語(yǔ)板書設(shè)計(jì)(課件)
- 三年級(jí)勞動(dòng)課1ppt
- 智能中臺(tái)數(shù)據(jù)底座解決方案
- 《財(cái)政與金融》課程教學(xué)大綱
- 《國(guó)際稅收》教案
- 傳統(tǒng)體育養(yǎng)生概論
評(píng)論
0/150
提交評(píng)論