工廠方法模式課件_第1頁
工廠方法模式課件_第2頁
工廠方法模式課件_第3頁
工廠方法模式課件_第4頁
工廠方法模式課件_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第5章工廠方法模式劉偉weiliu_china@第5章工廠方法模式劉偉本章教學(xué)內(nèi)容工廠方法模式模式動機(jī)與定義模式結(jié)構(gòu)與分析模式實例與解析模式效果與應(yīng)用模式擴(kuò)展本章教學(xué)內(nèi)容工廠方法模式工廠方法模式簡單工廠模式的不足在簡單工廠模式中,只提供了一個工廠類,該工廠類處于對產(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ò)展性,而工廠方法模式則可以很好地解決這一問題。工廠方法模式簡單工廠模式的不足工廠方法模式模式動機(jī)考慮這樣一個系統(tǒng),按鈕工廠類可以返回一個具體的按鈕實例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個系統(tǒng)中,如果需要增加一種新類型的按鈕,如橢圓形按鈕,那么除了增加一個新的具體產(chǎn)品類之外,還需要修改工廠類的代碼,這就使得整個設(shè)計在一定程度上違反了“開閉原則”。

工廠方法模式模式動機(jī)工廠方法模式模式動機(jī)現(xiàn)在對該系統(tǒng)進(jìn)行修改,不再設(shè)計一個按鈕工廠類來統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過程交給專門的工廠子類去完成,我們先定義一個抽象的按鈕工廠類,再定義具體的工廠類來生成圓形按鈕、矩形按鈕、菱形按鈕等,它們實現(xiàn)在抽象按鈕工廠類中定義的方法。這種抽象化的結(jié)果使這種結(jié)構(gòu)可以在不修改具體工廠類的情況下引進(jìn)新的產(chǎn)品,如果出現(xiàn)新的按鈕類型,只需要為這種新類型的按鈕創(chuàng)建一個具體的工廠類就可以獲得該新按鈕的實例,這一特點無疑使得工廠方法模式具有超越簡單工廠模式的優(yōu)越性,更加符合“開閉原則”。工廠方法模式模式動機(jī)工廠方法模式模式動機(jī)使用工廠方法模式設(shè)計的按鈕工廠工廠方法模式模式動機(jī)工廠方法模式模式定義工廠方法模式(FactoryMethodPattern)又稱為工廠模式,也叫虛擬構(gòu)造器(VirtualConstructor)模式或者多態(tài)工廠(PolymorphicFactory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。工廠方法模式模式定義工廠方法模式模式定義FactoryMethodPattern:Defineaninterfaceforcreatinganobject,butletsubclasses

decidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.Frequencyofuse:high

工廠方法模式模式定義工廠方法模式模式結(jié)構(gòu)工廠方法模式模式結(jié)構(gòu)工廠方法模式模式結(jié)構(gòu)工廠方法模式包含如下角色:Product:抽象產(chǎn)品ConcreteProduct:具體產(chǎn)品Factory:抽象工廠ConcreteFactory:具體工廠工廠方法模式模式結(jié)構(gòu)工廠方法模式模式分析工廠方法模式是簡單工廠模式的進(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ò)展需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體產(chǎn)品對象以及一個具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不需要修改客戶端,很好地符合了“開閉原則”。而簡單工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡單工廠模式。工廠方法模式模式分析工廠方法模式模式分析抽象工廠類代碼:publicabstractclassPayMethodFactory{publicabstractAbstractPaygetPayMethod();}抽象工廠類工廠方法模式模式分析publicabstractclas工廠方法模式模式分析具體工廠類代碼:publicclassCashPayFactoryextendsPayMethodFactory{publicAbstractPaygetPayMethod(){returnnewCashPay();}}

具體工廠類工廠方法模式模式分析publicclassCashPay工廠方法模式模式分析客戶類代碼片段:為了提高系統(tǒng)的可擴(kuò)展性和靈活性,在定義工廠和產(chǎn)品時都必須使用抽象層,如果需要更換產(chǎn)品類,只需要更換對應(yīng)的工廠即可,其他代碼不需要進(jìn)行任何修改。PayMethodFactoryfactory;AbstractPaypayMethod;factory=newCashPayFactory();payMethod=factory.getPayMethod();payMethod.pay();工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式分析配置文件代碼:在實際的應(yīng)用開發(fā)中,一般將具體工廠類的實例化過程進(jìn)行改進(jìn),不直接使用new關(guān)鍵字來創(chuàng)建對象,而是將具體類的類名寫入配置文件中,再通過Java的反射機(jī)制,讀取XML格式的配置文件,根據(jù)存儲在XML文件中的類名字符串生成對象。<?xmlversion="1.0"?><config> <className>CashPayFactory</className></config>

工廠方法模式模式分析<?xmlversion="1.0"?工廠方法模式模式分析Java反射(JavaReflection):是指在程序運行時獲取已知名稱的類或已有對象的相關(guān)信息的一種機(jī)制,包括類的方法、屬性、超類等信息,還包括實例的創(chuàng)建和實例類型的判斷等??赏ㄟ^Class類的forName()方法返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的Class對象,再通過newInstance()方法創(chuàng)建此對象所表示的類的一個新實例,即通過一個類名字符串得到類的實例。//創(chuàng)建一個字符串類型的對象Classc=Class.forName(“String”);Objectobj=c.newInstance();returnobj;工廠方法模式模式分析//創(chuàng)建一個字符串類型的對象工廠方法模式模式分析工具類XMLUtil代碼片段: //創(chuàng)建DOM文檔對象

DocumentBuilderFactorydFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dFactory.newDocumentBuilder(); Documentdoc; doc=builder.parse(newFile("config.xml"));

//獲取包含類名的文本節(jié)點

NodeListnl=doc.getElementsByTagName("className");NodeclassNode=nl.item(0).getFirstChild();StringcName=classNode.getNodeValue();

//通過類名生成實例對象并將其返回

Classc=Class.forName(cName); Objectobj=c.newInstance();returnobj;工廠方法模式模式分析 //創(chuàng)建DOM文檔對象工廠方法模式模式分析修改后的客戶類代碼片段:PayMethodFactory

factory;AbstractPaypayMethod;factory=(PayMethodFactory)XMLUtil.getBean();//getBean()的返回類型為Object,此處需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換payMethod=factory.getPayMethod();payMethod.pay();

工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式實例與解析實例一:電視機(jī)工廠將原有的工廠進(jìn)行分割,為每種品牌的電視機(jī)提供一個子工廠,海爾工廠專門負(fù)責(zé)生產(chǎn)海爾電視機(jī),海信工廠專門負(fù)責(zé)生產(chǎn)海信電視機(jī),如果需要生產(chǎn)TCL電視機(jī)或創(chuàng)維電視機(jī),只需要對應(yīng)增加一個新的TCL工廠或創(chuàng)維工廠即可,原有的工廠無須做任何修改,使得整個系統(tǒng)具有更加的靈活性和可擴(kuò)展性。工廠方法模式模式實例與解析工廠方法模式模式實例與解析實例一:電視機(jī)工廠工廠方法模式模式實例與解析工廠方法模式模式實例與解析實例一:電視機(jī)工廠參考代碼(Chapter05FactoryMethod\sample01)演示……工廠方法模式模式實例與解析演示……工廠方法模式模式實例與解析實例二:日志記錄器某系統(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)品類的類名?;诠S角色和產(chǎn)品角色的多態(tài)性設(shè)計是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(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)缺點工廠方法模式模式優(yōu)缺點工廠方法模式的缺點在添加新產(chǎn)品時,需要編寫新的具體產(chǎn)品類,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運行,會給系統(tǒng)帶來一些額外的開銷。由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實現(xiàn)時可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實現(xiàn)難度。工廠方法模式模式優(yōu)缺點工廠方法模式模式適用環(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)性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴(kuò)展。將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類,需要時再動態(tài)指定,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。工廠方法模式模式適用環(huán)境工廠方法模式模式應(yīng)用(1)java.util.Collection接口的iterator()方法:工廠方法模式模式應(yīng)用工廠方法模式模式應(yīng)用(2)Java消息服務(wù)JMS(JavaMessagingService)://使用上下文和JNDI得到連接工廠的引用,ctx是上下文Context類型的對象QueueConnectionFactoryqConnFact=(QueueConnectionFactory)ctx.lookup("cfJndi");//使用連接工廠創(chuàng)建一個連接QueueConnectionqConn=qConnFact.createQueueConnection();//使用連接創(chuàng)建一個會話QueueSessionqSess=qConn.createQueueSession(false,javax.jms.QueueSession.AUTO_ACKNOWLEDGE);//使用上下文和JNDI得到消息隊列的引用Queueq=(Queue)ctx.lookup("myQueue");//使用連接創(chuàng)建一個需要發(fā)送的消息類型的實例QueueSenderqSend=qSess.createSender(q);System.out.println("開始發(fā)送消息......");工廠方法模式模式應(yīng)用//使用上下文和JNDI得到連接工廠的引工廠方法模式模式應(yīng)用(3)JDBC中的工廠方法:Connectionconn=DriverManager.getConnection("jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=DB;user=sa;password=");Statementstatement=conn.createStatement();ResultSetrs=statement.executeQuery("select*fromUserInfo");工廠方法模式模式應(yīng)用Connectionconn=Driv工廠方法模式模式擴(kuò)展使用多個工廠方法:在抽象工廠角色中可以定義多個工廠方法,從而使具體工廠角色實現(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)中只有一個具體工廠類的話,抽象工廠就可以省略,也將發(fā)生了退化。當(dāng)只有一個具體工廠,在具體工廠中可以創(chuàng)建所有的產(chǎn)品對象,并且工廠方法設(shè)計為靜態(tài)方法時,工廠方法模式就退化成簡單工廠模式。工廠方法模式模式擴(kuò)展本章小結(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)品由專門的具體工廠創(chuàng)建,它們之間往往一一對應(yīng);抽象工廠中聲明了工廠方法,用于返回一個產(chǎn)品,它是工廠方法模式的核心,任何在模式中創(chuàng)建對象的工廠類都必須實現(xiàn)該接口;具體工廠是抽象工廠類的子類,實現(xiàn)了抽象工廠中定義的工廠方法,并可由客戶調(diào)用,返回一個具體產(chǎn)品類的實例。本章小結(jié)工廠方法模式又稱為工廠模式,它屬于類創(chuàng)建型模式。在工本章小結(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)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。工廠方法模式的主要優(yōu)點是增加新的產(chǎn)品類時無須修改現(xiàn)有系統(tǒng),并封裝了產(chǎn)品對象的創(chuàng)建細(xì)節(jié),系統(tǒng)具有良好的靈活性和可擴(kuò)展性;其缺點在于增加新產(chǎn)品的同時需要增加新的工廠,導(dǎo)致系統(tǒng)類的個數(shù)成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜性。工廠方法模式適用情況包括:一個類不知道它所需要的對象的類;一個類通過其子類來指定創(chuàng)建哪個對象;將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類,需要時再動態(tài)指定。本章小結(jié)工廠方法模式是簡單工廠模式的進(jìn)一步抽象和推廣。由于使ENDThanks!ENDThanks!演講完畢,謝謝觀看!演講完畢,謝謝觀看!第5章工廠方法模式劉偉weiliu_china@第5章工廠方法模式劉偉本章教學(xué)內(nèi)容工廠方法模式模式動機(jī)與定義模式結(jié)構(gòu)與分析模式實例與解析模式效果與應(yīng)用模式擴(kuò)展本章教學(xué)內(nèi)容工廠方法模式工廠方法模式簡單工廠模式的不足在簡單工廠模式中,只提供了一個工廠類,該工廠類處于對產(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ò)展性,而工廠方法模式則可以很好地解決這一問題。工廠方法模式簡單工廠模式的不足工廠方法模式模式動機(jī)考慮這樣一個系統(tǒng),按鈕工廠類可以返回一個具體的按鈕實例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個系統(tǒng)中,如果需要增加一種新類型的按鈕,如橢圓形按鈕,那么除了增加一個新的具體產(chǎn)品類之外,還需要修改工廠類的代碼,這就使得整個設(shè)計在一定程度上違反了“開閉原則”。

工廠方法模式模式動機(jī)工廠方法模式模式動機(jī)現(xiàn)在對該系統(tǒng)進(jìn)行修改,不再設(shè)計一個按鈕工廠類來統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過程交給專門的工廠子類去完成,我們先定義一個抽象的按鈕工廠類,再定義具體的工廠類來生成圓形按鈕、矩形按鈕、菱形按鈕等,它們實現(xiàn)在抽象按鈕工廠類中定義的方法。這種抽象化的結(jié)果使這種結(jié)構(gòu)可以在不修改具體工廠類的情況下引進(jìn)新的產(chǎn)品,如果出現(xiàn)新的按鈕類型,只需要為這種新類型的按鈕創(chuàng)建一個具體的工廠類就可以獲得該新按鈕的實例,這一特點無疑使得工廠方法模式具有超越簡單工廠模式的優(yōu)越性,更加符合“開閉原則”。工廠方法模式模式動機(jī)工廠方法模式模式動機(jī)使用工廠方法模式設(shè)計的按鈕工廠工廠方法模式模式動機(jī)工廠方法模式模式定義工廠方法模式(FactoryMethodPattern)又稱為工廠模式,也叫虛擬構(gòu)造器(VirtualConstructor)模式或者多態(tài)工廠(PolymorphicFactory)模式,它屬于類創(chuàng)建型模式。在工廠方法模式中,工廠父類負(fù)責(zé)定義創(chuàng)建產(chǎn)品對象的公共接口,而工廠子類則負(fù)責(zé)生成具體的產(chǎn)品對象,這樣做的目的是將產(chǎn)品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應(yīng)該實例化哪一個具體產(chǎn)品類。工廠方法模式模式定義工廠方法模式模式定義FactoryMethodPattern:Defineaninterfaceforcreatinganobject,butletsubclasses

decidewhichclasstoinstantiate.FactoryMethodletsaclassdeferinstantiationtosubclasses.Frequencyofuse:high

工廠方法模式模式定義工廠方法模式模式結(jié)構(gòu)工廠方法模式模式結(jié)構(gòu)工廠方法模式模式結(jié)構(gòu)工廠方法模式包含如下角色:Product:抽象產(chǎn)品ConcreteProduct:具體產(chǎn)品Factory:抽象工廠ConcreteFactory:具體工廠工廠方法模式模式結(jié)構(gòu)工廠方法模式模式分析工廠方法模式是簡單工廠模式的進(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ò)展需要添加新的產(chǎn)品對象時,僅僅需要添加一個具體產(chǎn)品對象以及一個具體工廠對象,原有工廠對象不需要進(jìn)行任何修改,也不需要修改客戶端,很好地符合了“開閉原則”。而簡單工廠模式在添加新產(chǎn)品對象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡單工廠模式。工廠方法模式模式分析工廠方法模式模式分析抽象工廠類代碼:publicabstractclassPayMethodFactory{publicabstractAbstractPaygetPayMethod();}抽象工廠類工廠方法模式模式分析publicabstractclas工廠方法模式模式分析具體工廠類代碼:publicclassCashPayFactoryextendsPayMethodFactory{publicAbstractPaygetPayMethod(){returnnewCashPay();}}

具體工廠類工廠方法模式模式分析publicclassCashPay工廠方法模式模式分析客戶類代碼片段:為了提高系統(tǒng)的可擴(kuò)展性和靈活性,在定義工廠和產(chǎn)品時都必須使用抽象層,如果需要更換產(chǎn)品類,只需要更換對應(yīng)的工廠即可,其他代碼不需要進(jìn)行任何修改。PayMethodFactoryfactory;AbstractPaypayMethod;factory=newCashPayFactory();payMethod=factory.getPayMethod();payMethod.pay();工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式分析配置文件代碼:在實際的應(yīng)用開發(fā)中,一般將具體工廠類的實例化過程進(jìn)行改進(jìn),不直接使用new關(guān)鍵字來創(chuàng)建對象,而是將具體類的類名寫入配置文件中,再通過Java的反射機(jī)制,讀取XML格式的配置文件,根據(jù)存儲在XML文件中的類名字符串生成對象。<?xmlversion="1.0"?><config> <className>CashPayFactory</className></config>

工廠方法模式模式分析<?xmlversion="1.0"?工廠方法模式模式分析Java反射(JavaReflection):是指在程序運行時獲取已知名稱的類或已有對象的相關(guān)信息的一種機(jī)制,包括類的方法、屬性、超類等信息,還包括實例的創(chuàng)建和實例類型的判斷等??赏ㄟ^Class類的forName()方法返回與帶有給定字符串名的類或接口相關(guān)聯(lián)的Class對象,再通過newInstance()方法創(chuàng)建此對象所表示的類的一個新實例,即通過一個類名字符串得到類的實例。//創(chuàng)建一個字符串類型的對象Classc=Class.forName(“String”);Objectobj=c.newInstance();returnobj;工廠方法模式模式分析//創(chuàng)建一個字符串類型的對象工廠方法模式模式分析工具類XMLUtil代碼片段: //創(chuàng)建DOM文檔對象

DocumentBuilderFactorydFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dFactory.newDocumentBuilder(); Documentdoc; doc=builder.parse(newFile("config.xml"));

//獲取包含類名的文本節(jié)點

NodeListnl=doc.getElementsByTagName("className");NodeclassNode=nl.item(0).getFirstChild();StringcName=classNode.getNodeValue();

//通過類名生成實例對象并將其返回

Classc=Class.forName(cName); Objectobj=c.newInstance();returnobj;工廠方法模式模式分析 //創(chuàng)建DOM文檔對象工廠方法模式模式分析修改后的客戶類代碼片段:PayMethodFactory

factory;AbstractPaypayMethod;factory=(PayMethodFactory)XMLUtil.getBean();//getBean()的返回類型為Object,此處需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換payMethod=factory.getPayMethod();payMethod.pay();

工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式實例與解析實例一:電視機(jī)工廠將原有的工廠進(jìn)行分割,為每種品牌的電視機(jī)提供一個子工廠,海爾工廠專門負(fù)責(zé)生產(chǎn)海爾電視機(jī),海信工廠專門負(fù)責(zé)生產(chǎn)海信電視機(jī),如果需要生產(chǎn)TCL電視機(jī)或創(chuàng)維電視機(jī),只需要對應(yīng)增加一個新的TCL工廠或創(chuàng)維工廠即可,原有的工廠無須做任何修改,使得整個系統(tǒng)具有更加的靈活性和可擴(kuò)展性。工廠方法模式模式實例與解析工廠方法模式模式實例與解析實例一:電視機(jī)工廠工廠方法模式模式實例與解析工廠方法模式模式實例與解析實例一:電視機(jī)工廠參考代碼(Chapter05FactoryMethod\sample01)演示……工廠方法模式模式實例與解析演示……工廠方法模式模式實例與解析實例二:日志記錄器某系統(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)品類的類名?;诠S角色和產(chǎn)品角色的多態(tài)性設(shè)計是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(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)缺點工廠方法模式模式優(yōu)缺點工廠方法模式的缺點在添加新產(chǎn)品時,需要編寫新的具體產(chǎn)品類,而且還要提供與之對應(yīng)的具體工廠類,系統(tǒng)中類的個數(shù)將成對增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類需要編譯和運行,會給系統(tǒng)帶來一些額外的開銷。由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實現(xiàn)時可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實現(xiàn)難度。工廠方法模式模式優(yōu)缺點工廠方法模式模式適用環(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)性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統(tǒng)更容易擴(kuò)展。將創(chuàng)建對象的任務(wù)委托給多個工廠子類中的某一個,客戶端在使用時可以無須關(guān)心是哪一個工廠子類創(chuàng)建產(chǎn)品子類,需要時再動態(tài)指定,可將具體工廠類的類名存儲在配置文件或數(shù)據(jù)庫中。工廠方法模式模式適用環(huán)境工廠方法模式模式應(yīng)用(1)java.util.Collection接口的iterator()方法:工廠方法模式模式應(yīng)用工廠方法模式模式應(yīng)用(2)Java消息服務(wù)JMS(JavaMessagingService)://使用上下文和JNDI得到連接工廠的引用,ctx是上下文Context類型的對象QueueConnectionFactoryqConnFact=(QueueConnectionFactory)ctx.lookup("cfJndi");//使用連接工廠創(chuàng)建一個連接QueueConnectionqConn=qConnFact.createQueueConnection();//使用連接創(chuàng)建一個會話QueueSessionqSess=qConn.createQueueSession(false,javax.jms.QueueSession.AUTO_ACKNOWLEDGE);//使用上下文和JNDI得到消息隊列的引用Queueq=(Queue)ctx.lookup("myQueue");//使用連接創(chuàng)建一個需要發(fā)送的消息類型的實例QueueSenderqSend=qSess.createSender(q);System.out.println("開始發(fā)送消息......");工廠方法模式模式應(yīng)用//使用上下文和JNDI得到連接工廠的引工廠方法模式模式應(yīng)用(3)JDBC中的工廠方法:Connectionconn=DriverManager.getConnection("jdbc:microsoft:sq

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論