




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第5章,工廠方法模式,劉 偉 weiliu_,本章教學(xué)內(nèi)容,工廠方法模式 模式動機與定義 模式結(jié)構(gòu)與分析 模式實例與解析 模式效果與應(yīng)用 模式擴(kuò)展,工廠方法模式,簡單工廠模式的不足 在簡單工廠模式中,只提供了一個工廠類,該工廠類處于對產(chǎn)品類進(jìn)行實例化的中心位置,它知道每一個產(chǎn)品對象的創(chuàng)建細(xì)節(jié),并決定何時實例化哪一個產(chǎn)品類。簡單工廠模式最大的缺點是當(dāng)有新產(chǎn)品要加入到系統(tǒng)中時,必須修改工廠類,加入必要的處理邏輯,這違背了“開閉原則”。在簡單工廠模式中,所有的產(chǎn)品都是由同一個工廠創(chuàng)建,工廠類職責(zé)較重,業(yè)務(wù)邏輯較為復(fù)雜,具體產(chǎn)品與工廠類之間的耦合度高,嚴(yán)重影響了系統(tǒng)的靈活性和擴(kuò)展性,而工廠方法模式則可
2、以很好地解決這一問題。,工廠方法模式,模式動機 考慮這樣一個系統(tǒng),按鈕工廠類可以返回一個具體的按鈕實例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個系統(tǒng)中,如果需要增加一種新類型的按鈕,如橢圓形按鈕,那么除了增加一個新的具體產(chǎn)品類之外,還需要修改工廠類的代碼,這就使得整個設(shè)計在一定程度上違反了“開閉原則”。,工廠方法模式,模式動機 現(xiàn)在對該系統(tǒng)進(jìn)行修改,不再設(shè)計一個按鈕工廠類來統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過程交給專門的工廠子類去完成,我們先定義一個抽象的按鈕工廠類,再定義具體的工廠類來生成圓形按鈕、矩形按鈕、菱形按鈕等,它們實現(xiàn)在抽象按鈕工廠類中定義的方法。這種抽象化的結(jié)果使這種結(jié)
3、構(gòu)可以在不修改具體工廠類的情況下引進(jìn)新的產(chǎn)品,如果出現(xiàn)新的按鈕類型,只需要為這種新類型的按鈕創(chuàng)建一個具體的工廠類就可以獲得該新按鈕的實例,這一特點無疑使得工廠方法模式具有超越簡單工廠模式的優(yōu)越性,更加符合“開閉原則”。,工廠方法模式,模式動機 使用工廠方法模式設(shè)計的按鈕工廠,工廠方法模式,模式定義 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構(gòu)造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的
4、產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(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:具體工廠,工廠方法模式,模式分析 工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負(fù)責(zé)給出具體工廠必須實現(xiàn)的接口,而不負(fù)責(zé)哪一個產(chǎn)品類被實例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。,工廠方法模式,模式分析 當(dāng)系統(tǒng)擴(kuò)展
6、需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體產(chǎn)品對象以及一個具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不需要修改客戶端,很好地符合了“開閉原則”。而簡單工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡單工廠模式。,工廠方法模式,模式分析 抽象工廠類代碼:,抽象工廠類,工廠方法模式,模式分析 具體工廠類代碼:,具體工廠類,工廠方法模式,模式分析 客戶類代碼片段: 為了提高系統(tǒng)的可擴(kuò)展性和靈活性,在定義工廠和產(chǎn)品時都必須使用抽象層,如果需要更換產(chǎn)品類,只需要更換對應(yīng)的工廠即可,其他代碼不需要進(jìn)行任何修改。,工廠方法模式,模式分析 配置文件代碼: 在實際
7、的應(yīng)用開發(fā)中,一般將具體工廠類的實例化過程進(jìn)行改進(jìn),不直接使用new關(guān)鍵字來創(chuàng)建對象,而是將具體類的類名寫入配置文件中,再通過Java的反射機制,讀取XML格式的配置文件,根據(jù)存儲在XML文件中的類名字符串生成對象。,工廠方法模式,模式分析 Java反射(Java Reflection): 是指在程序運行時獲取已知名稱的類或已有對象的相關(guān)信息的一種機制,包括類的方法、屬性、超類等信息,還包括實例的創(chuàng)建和實例類型的判斷等??赏ㄟ^Class類的forName()方法返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的Class對象,再通過newInstance()方法創(chuàng)建此對象所表示的類的一個新實例,即通過一
8、個類名字符串得到類的實例。,工廠方法模式,模式分析 工具類XMLUtil代碼片段:,工廠方法模式,模式分析 修改后的客戶類代碼片段:,工廠方法模式,模式實例與解析 實例一:電視機工廠 將原有的工廠進(jìn)行分割,為每種品牌的電視機提供一個子工廠,海爾工廠專門負(fù)責(zé)生產(chǎn)海爾電視機,海信工廠專門負(fù)責(zé)生產(chǎn)海信電視機,如果需要生產(chǎn)TCL電視機或創(chuàng)維電視機,只需要對應(yīng)增加一個新的TCL工廠或創(chuàng)維工廠即可,原有的工廠無須做任何修改,使得整個系統(tǒng)具有更加的靈活性和可擴(kuò)展性。,工廠方法模式,模式實例與解析 實例一:電視機工廠,工廠方法模式,模式實例與解析 實例一:電視機工廠 參考代碼(Chapter 05 Facto
9、ry Methodsample01),演示,工廠方法模式,模式實例與解析 實例二:日志記錄器 某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄、數(shù)據(jù)庫記錄等,且用戶可以根據(jù)要求動態(tài)選擇日志記錄方式,現(xiàn)使用工廠方法模式設(shè)計該系統(tǒng)。,工廠方法模式,模式實例與解析 實例二:日志記錄器,工廠方法模式,模式優(yōu)缺點 工廠方法模式的優(yōu)點 在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產(chǎn)品,同時還向客戶隱藏了哪種具體產(chǎn)品類將被實例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對應(yīng)的工廠,無須關(guān)心創(chuàng)建細(xì)節(jié),甚至無須知道具體產(chǎn)品類的類名。 基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)
10、建何種產(chǎn)品對象,而如何創(chuàng)建這個對象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因為所有的具體工廠類都具有同一抽象父類。 使用工廠方法模式的另一個優(yōu)點是在系統(tǒng)中加入新產(chǎn)品時,無須修改抽象工廠和抽象產(chǎn)品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開閉原則”。,工廠方法模式,模式優(yōu)缺點 工廠方法模式的缺點 在添加新產(chǎn)品時,需要編寫新的具體產(chǎn)品類,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運行,會
11、給系統(tǒng)帶來一些額外的開銷。 由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實現(xiàn)時可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實現(xiàn)難度。,工廠方法模式,模式適用環(huán)境 在以下情況下可以使用工廠方法模式: 一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類的類名,只需要知道所對應(yīng)的工廠即可,具體的產(chǎn)品對象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類。 一個類通過其子類來指定創(chuàng)建哪個對象:在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產(chǎn)品的接口,而由其子類來確定具體要創(chuàng)建的對象,利用面向?qū)ο蟮亩鄳B(tài)性
12、和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴(kuò)展。 將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類,需要時再動態(tài)指定,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。,工廠方法模式,模式應(yīng)用 (1) java.util.Collection接口的iterator()方法:,工廠方法模式,模式應(yīng)用 (2) Java消息服務(wù)JMS(Java Messaging Service) :,工廠方法模式,模式應(yīng)用 (3) JDBC中的工廠方法:,工廠方法模式,模式擴(kuò)展 使用多個工廠方法:在抽象工廠角色中可以定義多個工廠方法,從
13、而使具體工廠角色實現(xiàn)這些不同的工廠方法,這些方法可以包含不同的業(yè)務(wù)邏輯,以滿足對不同的產(chǎn)品對象的需求。 產(chǎn)品對象的重復(fù)使用:工廠對象將已經(jīng)創(chuàng)建過的產(chǎn)品保存到一個集合(如數(shù)組、List等)中,然后根據(jù)客戶對產(chǎn)品的請求,對集合進(jìn)行查詢。如果有滿足要求的產(chǎn)品對象,就直接將該產(chǎn)品返回客戶端;如果集合中沒有這樣的產(chǎn)品對象,那么就創(chuàng)建一個新的滿足要求的產(chǎn)品對象,然后將這個對象在增加到集合中,再返回給客戶端。 多態(tài)性的喪失和模式的退化:如果工廠僅僅返回一個具體產(chǎn)品對象,便違背了工廠方法的用意,發(fā)生退化,此時就不再是工廠方法模式了。一般來說,工廠對象應(yīng)當(dāng)有一個抽象的父類型,如果工廠等級結(jié)構(gòu)中只有一個具體工廠類
14、的話,抽象工廠就可以省略,也將發(fā)生了退化。當(dāng)只有一個具體工廠,在具體工廠中可以創(chuàng)建所有的產(chǎn)品對象,并且工廠方法設(shè)計為靜態(tài)方法時,工廠方法模式就退化成簡單工廠模式。,本章小結(jié),工廠方法模式又稱為工廠模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。 工廠方法模式包含四個角色:抽象產(chǎn)品是定義產(chǎn)品的接口,是工廠方法模式所創(chuàng)建對象的超類型,即產(chǎn)品對象的共同父類或接口;具體產(chǎn)品實現(xiàn)了抽象產(chǎn)品接口,某種類型的具體產(chǎn)品由專門的具體工
15、廠創(chuàng)建,它們之間往往一一對應(yīng);抽象工廠中聲明了工廠方法,用于返回一個產(chǎn)品,它是工廠方法模式的核心,任何在模式中創(chuàng)建對象的工廠類都必須實現(xiàn)該接口;具體工廠是抽象工廠類的子類,實現(xiàn)了抽象工廠中定義的工廠方法,并可由客戶調(diào)用,返回一個具體產(chǎn)品類的實例。,本章小結(jié),工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負(fù)責(zé)給出具體工廠必須實現(xiàn)的接口,而不負(fù)責(zé)產(chǎn)品類被實例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肛瘺護(hù)理課件
- 對口統(tǒng)招數(shù)學(xué)試卷
- 對口本科數(shù)學(xué)試卷
- 東營高考一模數(shù)學(xué)試卷
- 玻璃維修培訓(xùn)課件大全
- 2025至2030磁引導(dǎo)膠囊內(nèi)鏡行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 2024年汕尾市市直單位招聘政府聘員筆試真題
- 2024年撫順職業(yè)技術(shù)學(xué)院輔導(dǎo)員考試真題
- 2025至2030餐飲行業(yè)市場深度研究及發(fā)展前景投資可行性分析報告
- 高二基礎(chǔ)數(shù)學(xué)試卷
- 獸醫(yī)傳染病學(xué)(山東聯(lián)盟)智慧樹知到答案章節(jié)測試2023年青島農(nóng)業(yè)大學(xué)
- 鋼結(jié)構(gòu)防腐油漆施工方案
- 第五講社會建設(shè)
- GB/T 35273-2020信息安全技術(shù)個人信息安全規(guī)范
- GB/T 20303.1-2006起重機司機室第1部分:總則
- GB 18068-2000水泥廠衛(wèi)生防護(hù)距離標(biāo)準(zhǔn)
- 教師調(diào)動登記表(模板)
- 《長方形和正方形》 完整版課件
- 2022年醫(yī)院收費員考試試題及答案
- 國家開放大學(xué)電大專科《市場營銷學(xué)》2021期末試題及答案(試卷號2175)
- 再遇青春同學(xué)聚會畫冊PPT模板
評論
0/150
提交評論