版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第5章,工廠方法模式,劉 偉 weiliu_,本章教學內容,工廠方法模式 模式動機與定義 模式結構與分析 模式實例與解析 模式效果與應用 模式擴展,工廠方法模式,簡單工廠模式的不足 在簡單工廠模式中,只提供了一個工廠類,該工廠類處于對產品類進行實例化的中心位置,它知道每一個產品對象的創(chuàng)建細節(jié),并決定何時實例化哪一個產品類。簡單工廠模式最大的缺點是當有新產品要加入到系統(tǒng)中時,必須修改工廠類,加入必要的處理邏輯,這違背了“開閉原則”。在簡單工廠模式中,所有的產品都是由同一個工廠創(chuàng)建,工廠類職責較重,業(yè)務邏輯較為復雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統(tǒng)的靈活性和擴展性,而工廠方法模式則可
2、以很好地解決這一問題。,工廠方法模式,模式動機 考慮這樣一個系統(tǒng),按鈕工廠類可以返回一個具體的按鈕實例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個系統(tǒng)中,如果需要增加一種新類型的按鈕,如橢圓形按鈕,那么除了增加一個新的具體產品類之外,還需要修改工廠類的代碼,這就使得整個設計在一定程度上違反了“開閉原則”。,工廠方法模式,模式動機 現(xiàn)在對該系統(tǒng)進行修改,不再設計一個按鈕工廠類來統(tǒng)一負責所有產品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過程交給專門的工廠子類去完成,我們先定義一個抽象的按鈕工廠類,再定義具體的工廠類來生成圓形按鈕、矩形按鈕、菱形按鈕等,它們實現(xiàn)在抽象按鈕工廠類中定義的方法。這種抽象化的結果使這種結
3、構可以在不修改具體工廠類的情況下引進新的產品,如果出現(xiàn)新的按鈕類型,只需要為這種新類型的按鈕創(chuàng)建一個具體的工廠類就可以獲得該新按鈕的實例,這一特點無疑使得工廠方法模式具有超越簡單工廠模式的優(yōu)越性,更加符合“開閉原則”。,工廠方法模式,模式動機 使用工廠方法模式設計的按鈕工廠,工廠方法模式,模式定義 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態(tài)工廠(Polymorphic Factory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負責定義創(chuàng)建產品對象的公共接口,而工廠子類則負責生成具體的
4、產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。,工廠方法模式,模式定義 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,工廠方法模式,模式結構,工廠方法模式,模
5、式結構 工廠方法模式包含如下角色: Product:抽象產品 ConcreteProduct:具體產品 Factory:抽象工廠 ConcreteFactory:具體工廠,工廠方法模式,模式分析 工廠方法模式是簡單工廠模式的進一步抽象和推廣。由于使用了面向對象的多態(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負責所有產品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現(xiàn)的接口,而不負責哪一個產品類被實例化這種細節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進新產品。,工廠方法模式,模式分析 當系統(tǒng)擴展
6、需要添加新的產品對象時,僅僅需要添加一個具體產品對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好地符合了“開閉原則”。而簡單工廠模式在添加新產品對象后不得不修改工廠方法,擴展性不好。工廠方法模式退化后可以演變成簡單工廠模式。,工廠方法模式,模式分析 抽象工廠類代碼:,抽象工廠類,工廠方法模式,模式分析 具體工廠類代碼:,具體工廠類,工廠方法模式,模式分析 客戶類代碼片段: 為了提高系統(tǒng)的可擴展性和靈活性,在定義工廠和產品時都必須使用抽象層,如果需要更換產品類,只需要更換對應的工廠即可,其他代碼不需要進行任何修改。,工廠方法模式,模式分析 配置文件代碼: 在實際
7、的應用開發(fā)中,一般將具體工廠類的實例化過程進行改進,不直接使用new關鍵字來創(chuàng)建對象,而是將具體類的類名寫入配置文件中,再通過Java的反射機制,讀取XML格式的配置文件,根據(jù)存儲在XML文件中的類名字符串生成對象。,工廠方法模式,模式分析 Java反射(Java Reflection): 是指在程序運行時獲取已知名稱的類或已有對象的相關信息的一種機制,包括類的方法、屬性、超類等信息,還包括實例的創(chuàng)建和實例類型的判斷等??赏ㄟ^Class類的forName()方法返回與帶有給定字符串名的類或接口相關聯(lián)的Class對象,再通過newInstance()方法創(chuàng)建此對象所表示的類的一個新實例,即通過一
8、個類名字符串得到類的實例。,工廠方法模式,模式分析 工具類XMLUtil代碼片段:,工廠方法模式,模式分析 修改后的客戶類代碼片段:,工廠方法模式,模式實例與解析 實例一:電視機工廠 將原有的工廠進行分割,為每種品牌的電視機提供一個子工廠,海爾工廠專門負責生產海爾電視機,海信工廠專門負責生產海信電視機,如果需要生產TCL電視機或創(chuàng)維電視機,只需要對應增加一個新的TCL工廠或創(chuàng)維工廠即可,原有的工廠無須做任何修改,使得整個系統(tǒng)具有更加的靈活性和可擴展性。,工廠方法模式,模式實例與解析 實例一:電視機工廠,工廠方法模式,模式實例與解析 實例一:電視機工廠 參考代碼(Chapter 05 Facto
9、ry Methodsample01),演示,工廠方法模式,模式實例與解析 實例二:日志記錄器 某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄、數(shù)據(jù)庫記錄等,且用戶可以根據(jù)要求動態(tài)選擇日志記錄方式,現(xiàn)使用工廠方法模式設計該系統(tǒng)。,工廠方法模式,模式實例與解析 實例二:日志記錄器,工廠方法模式,模式優(yōu)缺點 工廠方法模式的優(yōu)點 在工廠方法模式中,工廠方法用來創(chuàng)建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節(jié),用戶只需要關心所需產品對應的工廠,無須關心創(chuàng)建細節(jié),甚至無須知道具體產品類的類名。 基于工廠角色和產品角色的多態(tài)性設計是工廠方法模式的關鍵。它能夠使工廠可以自主確定創(chuàng)
10、建何種產品對象,而如何創(chuàng)建這個對象的細節(jié)則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因為所有的具體工廠類都具有同一抽象父類。 使用工廠方法模式的另一個優(yōu)點是在系統(tǒng)中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就可以了。這樣,系統(tǒng)的可擴展性也就變得非常好,完全符合“開閉原則”。,工廠方法模式,模式優(yōu)缺點 工廠方法模式的缺點 在添加新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復雜度,有更多的類需要編譯和運行,會
11、給系統(tǒng)帶來一些額外的開銷。 由于考慮到系統(tǒng)的可擴展性,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增加了系統(tǒng)的抽象性和理解難度,且在實現(xiàn)時可能需要用到DOM、反射等技術,增加了系統(tǒng)的實現(xiàn)難度。,工廠方法模式,模式適用環(huán)境 在以下情況下可以使用工廠方法模式: 一個類不知道它所需要的對象的類:在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品對象由具體工廠類創(chuàng)建;客戶端需要知道創(chuàng)建具體產品的工廠類。 一個類通過其子類來指定創(chuàng)建哪個對象:在工廠方法模式中,對于抽象工廠類只需要提供一個創(chuàng)建產品的接口,而由其子類來確定具體要創(chuàng)建的對象,利用面向對象的多態(tài)性
12、和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴展。 將創(chuàng)建對象的任務委托給多個工廠子類中的某一個,客戶端在使用時可以無須關心是哪一個工廠子類創(chuàng)建產品子類,需要時再動態(tài)指定,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。,工廠方法模式,模式應用 (1) java.util.Collection接口的iterator()方法:,工廠方法模式,模式應用 (2) Java消息服務JMS(Java Messaging Service) :,工廠方法模式,模式應用 (3) JDBC中的工廠方法:,工廠方法模式,模式擴展 使用多個工廠方法:在抽象工廠角色中可以定義多個工廠方法,從
13、而使具體工廠角色實現(xiàn)這些不同的工廠方法,這些方法可以包含不同的業(yè)務邏輯,以滿足對不同的產品對象的需求。 產品對象的重復使用:工廠對象將已經(jīng)創(chuàng)建過的產品保存到一個集合(如數(shù)組、List等)中,然后根據(jù)客戶對產品的請求,對集合進行查詢。如果有滿足要求的產品對象,就直接將該產品返回客戶端;如果集合中沒有這樣的產品對象,那么就創(chuàng)建一個新的滿足要求的產品對象,然后將這個對象在增加到集合中,再返回給客戶端。 多態(tài)性的喪失和模式的退化:如果工廠僅僅返回一個具體產品對象,便違背了工廠方法的用意,發(fā)生退化,此時就不再是工廠方法模式了。一般來說,工廠對象應當有一個抽象的父類型,如果工廠等級結構中只有一個具體工廠類
14、的話,抽象工廠就可以省略,也將發(fā)生了退化。當只有一個具體工廠,在具體工廠中可以創(chuàng)建所有的產品對象,并且工廠方法設計為靜態(tài)方法時,工廠方法模式就退化成簡單工廠模式。,本章小結,工廠方法模式又稱為工廠模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負責定義創(chuàng)建產品對象的公共接口,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類。 工廠方法模式包含四個角色:抽象產品是定義產品的接口,是工廠方法模式所創(chuàng)建對象的超類型,即產品對象的共同父類或接口;具體產品實現(xiàn)了抽象產品接口,某種類型的具體產品由專門的具體工
15、廠創(chuàng)建,它們之間往往一一對應;抽象工廠中聲明了工廠方法,用于返回一個產品,它是工廠方法模式的核心,任何在模式中創(chuàng)建對象的工廠類都必須實現(xiàn)該接口;具體工廠是抽象工廠類的子類,實現(xiàn)了抽象工廠中定義的工廠方法,并可由客戶調用,返回一個具體產品類的實例。,本章小結,工廠方法模式是簡單工廠模式的進一步抽象和推廣。由于使用了面向對象的多態(tài)性,工廠方法模式保持了簡單工廠模式的優(yōu)點,而且克服了它的缺點。在工廠方法模式中,核心的工廠類不再負責所有產品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現(xiàn)的接口,而不負責產品類被實例化這種細節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年建華區(qū)消防大隊政府專職消防員招聘備考題庫帶答案詳解
- 2026年寧波市江北工投控股集團有限公司公開招聘勞務派遣工作人員備考題庫帶答案詳解
- 2026年延平區(qū)水東街道社區(qū)衛(wèi)生服務中心招聘臨床醫(yī)師備考題庫及1套參考答案詳解
- 2025年安徽新華圖書音像連鎖有限公司外包服務人員(第二批)補充招聘備考題庫及1套完整答案詳解
- 2026年寧波中遠海運集裝箱運輸有限公司招聘備考題庫及完整答案詳解一套
- 2026年嘉禾縣事業(yè)單位公開選聘工作人員19人備考題庫及1套完整答案詳解
- 2026年【重點單位】知名國企海南南海網(wǎng)傳媒股份有限公司招聘備考題庫及答案詳解參考
- 2026年廣東粵海水務股份有限公司招聘備考題庫及1套參考答案詳解
- 2026年南京鼓樓醫(yī)院宿遷分院招聘備考題庫含答案詳解
- 2026年南通再就業(yè)工程開發(fā)有限公司公開招聘外包人員備考題庫及答案詳解1套
- 【一例擴張型心肌病合并心力衰竭患者的個案護理】5400字【論文】
- 四川橋梁工程系梁專項施工方案
- DB32T 3695-2019房屋面積測算技術規(guī)程
- 貴州省納雍縣水東鄉(xiāng)水東鉬鎳礦采礦權評估報告
- GB 8270-2014食品安全國家標準食品添加劑甜菊糖苷
- 2023年杭州臨平環(huán)境科技有限公司招聘筆試題庫及答案解析
- 易制毒化學品日常管理有關問題權威解釋和答疑
- LF爐機械設備安裝施工方案
- 湖北省高等教育自學考試
- 企業(yè)三級安全生產標準化評定表(新版)
- 中心衛(wèi)生院關于成立按病種分值付費(DIP)工作領導小組及制度的通知
評論
0/150
提交評論