版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第5章工廠方法模式劉偉weiliu_china@第5章工廠方法模式劉偉本章教學(xué)內(nèi)容工廠方法模式模式動(dòng)機(jī)與定義模式結(jié)構(gòu)與分析模式實(shí)例與解析模式效果與應(yīng)用模式擴(kuò)展本章教學(xué)內(nèi)容工廠方法模式工廠方法模式簡(jiǎn)單工廠模式的不足在簡(jiǎn)單工廠模式中,只提供了一個(gè)工廠類(lèi),該工廠類(lèi)處于對(duì)產(chǎn)品類(lèi)進(jìn)行實(shí)例化的中心位置,它知道每一個(gè)產(chǎn)品對(duì)象的創(chuàng)建細(xì)節(jié),并決定何時(shí)實(shí)例化哪一個(gè)產(chǎn)品類(lèi)。簡(jiǎn)單工廠模式最大的缺點(diǎn)是當(dāng)有新產(chǎn)品要加入到系統(tǒng)中時(shí),必須修改工廠類(lèi),加入必要的處理邏輯,這違背了“開(kāi)閉原則”。在簡(jiǎn)單工廠模式中,所有的產(chǎn)品都是由同一個(gè)工廠創(chuàng)建,工廠類(lèi)職責(zé)較重,業(yè)務(wù)邏輯較為復(fù)雜,具體產(chǎn)品與工廠類(lèi)之間的耦合度高,嚴(yán)重影響了系統(tǒng)的靈活性和擴(kuò)展性,而工廠方法模式則可以很好地解決這一問(wèn)題。工廠方法模式簡(jiǎn)單工廠模式的不足工廠方法模式模式動(dòng)機(jī)考慮這樣一個(gè)系統(tǒng),按鈕工廠類(lèi)可以返回一個(gè)具體的按鈕實(shí)例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個(gè)系統(tǒng)中,如果需要增加一種新類(lèi)型的按鈕,如橢圓形按鈕,那么除了增加一個(gè)新的具體產(chǎn)品類(lèi)之外,還需要修改工廠類(lèi)的代碼,這就使得整個(gè)設(shè)計(jì)在一定程度上違反了“開(kāi)閉原則”。
工廠方法模式模式動(dòng)機(jī)工廠方法模式模式動(dòng)機(jī)現(xiàn)在對(duì)該系統(tǒng)進(jìn)行修改,不再設(shè)計(jì)一個(gè)按鈕工廠類(lèi)來(lái)統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過(guò)程交給專(zhuān)門(mén)的工廠子類(lèi)去完成,我們先定義一個(gè)抽象的按鈕工廠類(lèi),再定義具體的工廠類(lèi)來(lái)生成圓形按鈕、矩形按鈕、菱形按鈕等,它們實(shí)現(xiàn)在抽象按鈕工廠類(lèi)中定義的方法。這種抽象化的結(jié)果使這種結(jié)構(gòu)可以在不修改具體工廠類(lèi)的情況下引進(jìn)新的產(chǎn)品,如果出現(xiàn)新的按鈕類(lèi)型,只需要為這種新類(lèi)型的按鈕創(chuàng)建一個(gè)具體的工廠類(lèi)就可以獲得該新按鈕的實(shí)例,這一特點(diǎn)無(wú)疑使得工廠方法模式具有超越簡(jiǎn)單工廠模式的優(yōu)越性,更加符合“開(kāi)閉原則”。工廠方法模式模式動(dòng)機(jī)工廠方法模式模式動(dòng)機(jī)使用工廠方法模式設(shè)計(jì)的按鈕工廠工廠方法模式模式動(dòng)機(jī)工廠方法模式模式定義工廠方法模式(FactoryMethodPattern)又稱為工廠模式,也叫虛擬構(gòu)造器(VirtualConstructor)模式或者多態(tài)工廠(PolymorphicFactory)模式,它屬于類(lèi)創(chuàng)建型模式。在工廠方法模式中,工廠父類(lèi)負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類(lèi)則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象,這樣做的目的是將產(chǎn)品類(lèi)的實(shí)例化操作延遲到工廠子類(lèi)中完成,即通過(guò)工廠子類(lèi)來(lái)確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類(lèi)。工廠方法模式模式定義工廠方法模式模式定義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)工廠方法模式模式分析工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類(lèi)去做。這個(gè)核心類(lèi)僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)哪一個(gè)產(chǎn)品類(lèi)被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
工廠方法模式模式分析工廠方法模式模式分析當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對(duì)象時(shí),僅僅需要添加一個(gè)具體產(chǎn)品對(duì)象以及一個(gè)具體工廠對(duì)象,原有工廠對(duì)象不需要進(jìn)行任何修改,也不需要修改客戶端,很好地符合了“開(kāi)閉原則”。而簡(jiǎn)單工廠模式在添加新產(chǎn)品對(duì)象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡(jiǎn)單工廠模式。工廠方法模式模式分析工廠方法模式模式分析抽象工廠類(lèi)代碼:publicabstractclassPayMethodFactory{publicabstractAbstractPaygetPayMethod();}抽象工廠類(lèi)工廠方法模式模式分析publicabstractclas工廠方法模式模式分析具體工廠類(lèi)代碼:publicclassCashPayFactoryextendsPayMethodFactory{publicAbstractPaygetPayMethod(){returnnewCashPay();}}
具體工廠類(lèi)工廠方法模式模式分析publicclassCashPay工廠方法模式模式分析客戶類(lèi)代碼片段:為了提高系統(tǒng)的可擴(kuò)展性和靈活性,在定義工廠和產(chǎn)品時(shí)都必須使用抽象層,如果需要更換產(chǎn)品類(lèi),只需要更換對(duì)應(yīng)的工廠即可,其他代碼不需要進(jìn)行任何修改。PayMethodFactoryfactory;AbstractPaypayMethod;factory=newCashPayFactory();payMethod=factory.getPayMethod();payMethod.pay();工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式分析配置文件代碼:在實(shí)際的應(yīng)用開(kāi)發(fā)中,一般將具體工廠類(lèi)的實(shí)例化過(guò)程進(jìn)行改進(jìn),不直接使用new關(guān)鍵字來(lái)創(chuàng)建對(duì)象,而是將具體類(lèi)的類(lèi)名寫(xiě)入配置文件中,再通過(guò)Java的反射機(jī)制,讀取XML格式的配置文件,根據(jù)存儲(chǔ)在XML文件中的類(lèi)名字符串生成對(duì)象。<?xmlversion="1.0"?><config> <className>CashPayFactory</className></config>
工廠方法模式模式分析<?xmlversion="1.0"?工廠方法模式模式分析Java反射(JavaReflection):是指在程序運(yùn)行時(shí)獲取已知名稱的類(lèi)或已有對(duì)象的相關(guān)信息的一種機(jī)制,包括類(lèi)的方法、屬性、超類(lèi)等信息,還包括實(shí)例的創(chuàng)建和實(shí)例類(lèi)型的判斷等??赏ㄟ^(guò)Class類(lèi)的forName()方法返回與帶有給定字符串名的類(lèi)或接口相關(guān)聯(lián)的Class對(duì)象,再通過(guò)newInstance()方法創(chuàng)建此對(duì)象所表示的類(lèi)的一個(gè)新實(shí)例,即通過(guò)一個(gè)類(lèi)名字符串得到類(lèi)的實(shí)例。//創(chuàng)建一個(gè)字符串類(lèi)型的對(duì)象Classc=Class.forName(“String”);Objectobj=c.newInstance();returnobj;工廠方法模式模式分析//創(chuàng)建一個(gè)字符串類(lèi)型的對(duì)象工廠方法模式模式分析工具類(lèi)XMLUtil代碼片段: //創(chuàng)建DOM文檔對(duì)象
DocumentBuilderFactorydFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dFactory.newDocumentBuilder(); Documentdoc; doc=builder.parse(newFile("config.xml"));
//獲取包含類(lèi)名的文本節(jié)點(diǎn)
NodeListnl=doc.getElementsByTagName("className");NodeclassNode=nl.item(0).getFirstChild();StringcName=classNode.getNodeValue();
//通過(guò)類(lèi)名生成實(shí)例對(duì)象并將其返回
Classc=Class.forName(cName); Objectobj=c.newInstance();returnobj;工廠方法模式模式分析 //創(chuàng)建DOM文檔對(duì)象工廠方法模式模式分析修改后的客戶類(lèi)代碼片段:PayMethodFactory
factory;AbstractPaypayMethod;factory=(PayMethodFactory)XMLUtil.getBean();//getBean()的返回類(lèi)型為Object,此處需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換payMethod=factory.getPayMethod();payMethod.pay();
工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式實(shí)例與解析實(shí)例一:電視機(jī)工廠將原有的工廠進(jìn)行分割,為每種品牌的電視機(jī)提供一個(gè)子工廠,海爾工廠專(zhuān)門(mén)負(fù)責(zé)生產(chǎn)海爾電視機(jī),海信工廠專(zhuān)門(mén)負(fù)責(zé)生產(chǎn)海信電視機(jī),如果需要生產(chǎn)TCL電視機(jī)或創(chuàng)維電視機(jī),只需要對(duì)應(yīng)增加一個(gè)新的TCL工廠或創(chuàng)維工廠即可,原有的工廠無(wú)須做任何修改,使得整個(gè)系統(tǒng)具有更加的靈活性和可擴(kuò)展性。工廠方法模式模式實(shí)例與解析工廠方法模式模式實(shí)例與解析實(shí)例一:電視機(jī)工廠工廠方法模式模式實(shí)例與解析工廠方法模式模式實(shí)例與解析實(shí)例一:電視機(jī)工廠參考代碼(Chapter05FactoryMethod\sample01)演示……工廠方法模式模式實(shí)例與解析演示……工廠方法模式模式實(shí)例與解析實(shí)例二:日志記錄器某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄、數(shù)據(jù)庫(kù)記錄等,且用戶可以根據(jù)要求動(dòng)態(tài)選擇日志記錄方式,現(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng)。工廠方法模式模式實(shí)例與解析工廠方法模式模式實(shí)例與解析實(shí)例二:日志記錄器工廠方法模式模式實(shí)例與解析工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式的優(yōu)點(diǎn)在工廠方法模式中,工廠方法用來(lái)創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類(lèi)將被實(shí)例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對(duì)應(yīng)的工廠,無(wú)須關(guān)心創(chuàng)建細(xì)節(jié),甚至無(wú)須知道具體產(chǎn)品類(lèi)的類(lèi)名。基于工廠角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類(lèi)都具有同一抽象父類(lèi)。使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時(shí),無(wú)須修改抽象工廠和抽象產(chǎn)品提供的接口,無(wú)須修改客戶端,也無(wú)須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開(kāi)閉原則”。工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式的缺點(diǎn)在添加新產(chǎn)品時(shí),需要編寫(xiě)新的具體產(chǎn)品類(lèi),而且還要提供與之對(duì)應(yīng)的具體工廠類(lèi),系統(tǒng)中類(lèi)的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類(lèi)需要編譯和運(yùn)行,會(huì)給系統(tǒng)帶來(lái)一些額外的開(kāi)銷(xiāo)。由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度。工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式模式適用環(huán)境在以下情況下可以使用工廠方法模式:一個(gè)類(lèi)不知道它所需要的對(duì)象的類(lèi):在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類(lèi)的類(lèi)名,只需要知道所對(duì)應(yīng)的工廠即可,具體的產(chǎn)品對(duì)象由具體工廠類(lèi)創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類(lèi)。一個(gè)類(lèi)通過(guò)其子類(lèi)來(lái)指定創(chuàng)建哪個(gè)對(duì)象:在工廠方法模式中,對(duì)于抽象工廠類(lèi)只需要提供一個(gè)創(chuàng)建產(chǎn)品的接口,而由其子類(lèi)來(lái)確定具體要?jiǎng)?chuàng)建的對(duì)象,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則,在程序運(yùn)行時(shí),子類(lèi)對(duì)象將覆蓋父類(lèi)對(duì)象,從而使得系統(tǒng)更容易擴(kuò)展。將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠子類(lèi)中的某一個(gè),客戶端在使用時(shí)可以無(wú)須關(guān)心是哪一個(gè)工廠子類(lèi)創(chuàng)建產(chǎn)品子類(lèi),需要時(shí)再動(dòng)態(tài)指定,可將具體工廠類(lèi)的類(lèi)名存儲(chǔ)在配置文件或數(shù)據(jù)庫(kù)中。工廠方法模式模式適用環(huán)境工廠方法模式模式應(yīng)用(1)java.util.Collection接口的iterator()方法:工廠方法模式模式應(yīng)用工廠方法模式模式應(yīng)用(2)Java消息服務(wù)JMS(JavaMessagingService)://使用上下文和JNDI得到連接工廠的引用,ctx是上下文Context類(lèi)型的對(duì)象QueueConnectionFactoryqConnFact=(QueueConnectionFactory)ctx.lookup("cfJndi");//使用連接工廠創(chuàng)建一個(gè)連接QueueConnectionqConn=qConnFact.createQueueConnection();//使用連接創(chuàng)建一個(gè)會(huì)話QueueSessionqSess=qConn.createQueueSession(false,javax.jms.QueueSession.AUTO_ACKNOWLEDGE);//使用上下文和JNDI得到消息隊(duì)列的引用Queueq=(Queue)ctx.lookup("myQueue");//使用連接創(chuàng)建一個(gè)需要發(fā)送的消息類(lèi)型的實(shí)例QueueSenderqSend=qSess.createSender(q);System.out.println("開(kāi)始發(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ò)展使用多個(gè)工廠方法:在抽象工廠角色中可以定義多個(gè)工廠方法,從而使具體工廠角色實(shí)現(xiàn)這些不同的工廠方法,這些方法可以包含不同的業(yè)務(wù)邏輯,以滿足對(duì)不同的產(chǎn)品對(duì)象的需求。產(chǎn)品對(duì)象的重復(fù)使用:工廠對(duì)象將已經(jīng)創(chuàng)建過(guò)的產(chǎn)品保存到一個(gè)集合(如數(shù)組、List等)中,然后根據(jù)客戶對(duì)產(chǎn)品的請(qǐng)求,對(duì)集合進(jìn)行查詢。如果有滿足要求的產(chǎn)品對(duì)象,就直接將該產(chǎn)品返回客戶端;如果集合中沒(méi)有這樣的產(chǎn)品對(duì)象,那么就創(chuàng)建一個(gè)新的滿足要求的產(chǎn)品對(duì)象,然后將這個(gè)對(duì)象在增加到集合中,再返回給客戶端。多態(tài)性的喪失和模式的退化:如果工廠僅僅返回一個(gè)具體產(chǎn)品對(duì)象,便違背了工廠方法的用意,發(fā)生退化,此時(shí)就不再是工廠方法模式了。一般來(lái)說(shuō),工廠對(duì)象應(yīng)當(dāng)有一個(gè)抽象的父類(lèi)型,如果工廠等級(jí)結(jié)構(gòu)中只有一個(gè)具體工廠類(lèi)的話,抽象工廠就可以省略,也將發(fā)生了退化。當(dāng)只有一個(gè)具體工廠,在具體工廠中可以創(chuàng)建所有的產(chǎn)品對(duì)象,并且工廠方法設(shè)計(jì)為靜態(tài)方法時(shí),工廠方法模式就退化成簡(jiǎn)單工廠模式。工廠方法模式模式擴(kuò)展本章小結(jié)工廠方法模式又稱為工廠模式,它屬于類(lèi)創(chuàng)建型模式。在工廠方法模式中,工廠父類(lèi)負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類(lèi)則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象,這樣做的目的是將產(chǎn)品類(lèi)的實(shí)例化操作延遲到工廠子類(lèi)中完成,即通過(guò)工廠子類(lèi)來(lái)確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類(lèi)。工廠方法模式包含四個(gè)角色:抽象產(chǎn)品是定義產(chǎn)品的接口,是工廠方法模式所創(chuàng)建對(duì)象的超類(lèi)型,即產(chǎn)品對(duì)象的共同父類(lèi)或接口;具體產(chǎn)品實(shí)現(xiàn)了抽象產(chǎn)品接口,某種類(lèi)型的具體產(chǎn)品由專(zhuān)門(mén)的具體工廠創(chuàng)建,它們之間往往一一對(duì)應(yīng);抽象工廠中聲明了工廠方法,用于返回一個(gè)產(chǎn)品,它是工廠方法模式的核心,任何在模式中創(chuàng)建對(duì)象的工廠類(lèi)都必須實(shí)現(xiàn)該接口;具體工廠是抽象工廠類(lèi)的子類(lèi),實(shí)現(xiàn)了抽象工廠中定義的工廠方法,并可由客戶調(diào)用,返回一個(gè)具體產(chǎn)品類(lèi)的實(shí)例。本章小結(jié)工廠方法模式又稱為工廠模式,它屬于類(lèi)創(chuàng)建型模式。在工本章小結(jié)工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類(lèi)去做。這個(gè)核心類(lèi)僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)產(chǎn)品類(lèi)被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。工廠方法模式的主要優(yōu)點(diǎn)是增加新的產(chǎn)品類(lèi)時(shí)無(wú)須修改現(xiàn)有系統(tǒng),并封裝了產(chǎn)品對(duì)象的創(chuàng)建細(xì)節(jié),系統(tǒng)具有良好的靈活性和可擴(kuò)展性;其缺點(diǎn)在于增加新產(chǎn)品的同時(shí)需要增加新的工廠,導(dǎo)致系統(tǒng)類(lèi)的個(gè)數(shù)成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜性。工廠方法模式適用情況包括:一個(gè)類(lèi)不知道它所需要的對(duì)象的類(lèi);一個(gè)類(lèi)通過(guò)其子類(lèi)來(lái)指定創(chuàng)建哪個(gè)對(duì)象;將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠子類(lèi)中的某一個(gè),客戶端在使用時(shí)可以無(wú)須關(guān)心是哪一個(gè)工廠子類(lèi)創(chuàng)建產(chǎn)品子類(lèi),需要時(shí)再動(dòng)態(tài)指定。本章小結(jié)工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使ENDThanks!ENDThanks!演講完畢,謝謝觀看!演講完畢,謝謝觀看!第5章工廠方法模式劉偉weiliu_china@第5章工廠方法模式劉偉本章教學(xué)內(nèi)容工廠方法模式模式動(dòng)機(jī)與定義模式結(jié)構(gòu)與分析模式實(shí)例與解析模式效果與應(yīng)用模式擴(kuò)展本章教學(xué)內(nèi)容工廠方法模式工廠方法模式簡(jiǎn)單工廠模式的不足在簡(jiǎn)單工廠模式中,只提供了一個(gè)工廠類(lèi),該工廠類(lèi)處于對(duì)產(chǎn)品類(lèi)進(jìn)行實(shí)例化的中心位置,它知道每一個(gè)產(chǎn)品對(duì)象的創(chuàng)建細(xì)節(jié),并決定何時(shí)實(shí)例化哪一個(gè)產(chǎn)品類(lèi)。簡(jiǎn)單工廠模式最大的缺點(diǎn)是當(dāng)有新產(chǎn)品要加入到系統(tǒng)中時(shí),必須修改工廠類(lèi),加入必要的處理邏輯,這違背了“開(kāi)閉原則”。在簡(jiǎn)單工廠模式中,所有的產(chǎn)品都是由同一個(gè)工廠創(chuàng)建,工廠類(lèi)職責(zé)較重,業(yè)務(wù)邏輯較為復(fù)雜,具體產(chǎn)品與工廠類(lèi)之間的耦合度高,嚴(yán)重影響了系統(tǒng)的靈活性和擴(kuò)展性,而工廠方法模式則可以很好地解決這一問(wèn)題。工廠方法模式簡(jiǎn)單工廠模式的不足工廠方法模式模式動(dòng)機(jī)考慮這樣一個(gè)系統(tǒng),按鈕工廠類(lèi)可以返回一個(gè)具體的按鈕實(shí)例,如圓形按鈕、矩形按鈕、菱形按鈕等。在這個(gè)系統(tǒng)中,如果需要增加一種新類(lèi)型的按鈕,如橢圓形按鈕,那么除了增加一個(gè)新的具體產(chǎn)品類(lèi)之外,還需要修改工廠類(lèi)的代碼,這就使得整個(gè)設(shè)計(jì)在一定程度上違反了“開(kāi)閉原則”。
工廠方法模式模式動(dòng)機(jī)工廠方法模式模式動(dòng)機(jī)現(xiàn)在對(duì)該系統(tǒng)進(jìn)行修改,不再設(shè)計(jì)一個(gè)按鈕工廠類(lèi)來(lái)統(tǒng)一負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體按鈕的創(chuàng)建過(guò)程交給專(zhuān)門(mén)的工廠子類(lèi)去完成,我們先定義一個(gè)抽象的按鈕工廠類(lèi),再定義具體的工廠類(lèi)來(lái)生成圓形按鈕、矩形按鈕、菱形按鈕等,它們實(shí)現(xiàn)在抽象按鈕工廠類(lèi)中定義的方法。這種抽象化的結(jié)果使這種結(jié)構(gòu)可以在不修改具體工廠類(lèi)的情況下引進(jìn)新的產(chǎn)品,如果出現(xiàn)新的按鈕類(lèi)型,只需要為這種新類(lèi)型的按鈕創(chuàng)建一個(gè)具體的工廠類(lèi)就可以獲得該新按鈕的實(shí)例,這一特點(diǎn)無(wú)疑使得工廠方法模式具有超越簡(jiǎn)單工廠模式的優(yōu)越性,更加符合“開(kāi)閉原則”。工廠方法模式模式動(dòng)機(jī)工廠方法模式模式動(dòng)機(jī)使用工廠方法模式設(shè)計(jì)的按鈕工廠工廠方法模式模式動(dòng)機(jī)工廠方法模式模式定義工廠方法模式(FactoryMethodPattern)又稱為工廠模式,也叫虛擬構(gòu)造器(VirtualConstructor)模式或者多態(tài)工廠(PolymorphicFactory)模式,它屬于類(lèi)創(chuàng)建型模式。在工廠方法模式中,工廠父類(lèi)負(fù)責(zé)定義創(chuàng)建產(chǎn)品對(duì)象的公共接口,而工廠子類(lèi)則負(fù)責(zé)生成具體的產(chǎn)品對(duì)象,這樣做的目的是將產(chǎn)品類(lèi)的實(shí)例化操作延遲到工廠子類(lèi)中完成,即通過(guò)工廠子類(lèi)來(lái)確定究竟應(yīng)該實(shí)例化哪一個(gè)具體產(chǎn)品類(lèi)。工廠方法模式模式定義工廠方法模式模式定義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)工廠方法模式模式分析工廠方法模式是簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。由于使用了面向?qū)ο蟮亩鄳B(tài)性,工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn),而且克服了它的缺點(diǎn)。在工廠方法模式中,核心的工廠類(lèi)不再負(fù)責(zé)所有產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建工作交給子類(lèi)去做。這個(gè)核心類(lèi)僅僅負(fù)責(zé)給出具體工廠必須實(shí)現(xiàn)的接口,而不負(fù)責(zé)哪一個(gè)產(chǎn)品類(lèi)被實(shí)例化這種細(xì)節(jié),這使得工廠方法模式可以允許系統(tǒng)在不修改工廠角色的情況下引進(jìn)新產(chǎn)品。
工廠方法模式模式分析工廠方法模式模式分析當(dāng)系統(tǒng)擴(kuò)展需要添加新的產(chǎn)品對(duì)象時(shí),僅僅需要添加一個(gè)具體產(chǎn)品對(duì)象以及一個(gè)具體工廠對(duì)象,原有工廠對(duì)象不需要進(jìn)行任何修改,也不需要修改客戶端,很好地符合了“開(kāi)閉原則”。而簡(jiǎn)單工廠模式在添加新產(chǎn)品對(duì)象后不得不修改工廠方法,擴(kuò)展性不好。工廠方法模式退化后可以演變成簡(jiǎn)單工廠模式。工廠方法模式模式分析工廠方法模式模式分析抽象工廠類(lèi)代碼:publicabstractclassPayMethodFactory{publicabstractAbstractPaygetPayMethod();}抽象工廠類(lèi)工廠方法模式模式分析publicabstractclas工廠方法模式模式分析具體工廠類(lèi)代碼:publicclassCashPayFactoryextendsPayMethodFactory{publicAbstractPaygetPayMethod(){returnnewCashPay();}}
具體工廠類(lèi)工廠方法模式模式分析publicclassCashPay工廠方法模式模式分析客戶類(lèi)代碼片段:為了提高系統(tǒng)的可擴(kuò)展性和靈活性,在定義工廠和產(chǎn)品時(shí)都必須使用抽象層,如果需要更換產(chǎn)品類(lèi),只需要更換對(duì)應(yīng)的工廠即可,其他代碼不需要進(jìn)行任何修改。PayMethodFactoryfactory;AbstractPaypayMethod;factory=newCashPayFactory();payMethod=factory.getPayMethod();payMethod.pay();工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式分析配置文件代碼:在實(shí)際的應(yīng)用開(kāi)發(fā)中,一般將具體工廠類(lèi)的實(shí)例化過(guò)程進(jìn)行改進(jìn),不直接使用new關(guān)鍵字來(lái)創(chuàng)建對(duì)象,而是將具體類(lèi)的類(lèi)名寫(xiě)入配置文件中,再通過(guò)Java的反射機(jī)制,讀取XML格式的配置文件,根據(jù)存儲(chǔ)在XML文件中的類(lèi)名字符串生成對(duì)象。<?xmlversion="1.0"?><config> <className>CashPayFactory</className></config>
工廠方法模式模式分析<?xmlversion="1.0"?工廠方法模式模式分析Java反射(JavaReflection):是指在程序運(yùn)行時(shí)獲取已知名稱的類(lèi)或已有對(duì)象的相關(guān)信息的一種機(jī)制,包括類(lèi)的方法、屬性、超類(lèi)等信息,還包括實(shí)例的創(chuàng)建和實(shí)例類(lèi)型的判斷等??赏ㄟ^(guò)Class類(lèi)的forName()方法返回與帶有給定字符串名的類(lèi)或接口相關(guān)聯(lián)的Class對(duì)象,再通過(guò)newInstance()方法創(chuàng)建此對(duì)象所表示的類(lèi)的一個(gè)新實(shí)例,即通過(guò)一個(gè)類(lèi)名字符串得到類(lèi)的實(shí)例。//創(chuàng)建一個(gè)字符串類(lèi)型的對(duì)象Classc=Class.forName(“String”);Objectobj=c.newInstance();returnobj;工廠方法模式模式分析//創(chuàng)建一個(gè)字符串類(lèi)型的對(duì)象工廠方法模式模式分析工具類(lèi)XMLUtil代碼片段: //創(chuàng)建DOM文檔對(duì)象
DocumentBuilderFactorydFactory=DocumentBuilderFactory.newInstance(); DocumentBuilderbuilder=dFactory.newDocumentBuilder(); Documentdoc; doc=builder.parse(newFile("config.xml"));
//獲取包含類(lèi)名的文本節(jié)點(diǎn)
NodeListnl=doc.getElementsByTagName("className");NodeclassNode=nl.item(0).getFirstChild();StringcName=classNode.getNodeValue();
//通過(guò)類(lèi)名生成實(shí)例對(duì)象并將其返回
Classc=Class.forName(cName); Objectobj=c.newInstance();returnobj;工廠方法模式模式分析 //創(chuàng)建DOM文檔對(duì)象工廠方法模式模式分析修改后的客戶類(lèi)代碼片段:PayMethodFactory
factory;AbstractPaypayMethod;factory=(PayMethodFactory)XMLUtil.getBean();//getBean()的返回類(lèi)型為Object,此處需要進(jìn)行強(qiáng)制類(lèi)型轉(zhuǎn)換payMethod=factory.getPayMethod();payMethod.pay();
工廠方法模式模式分析PayMethodFactoryfac工廠方法模式模式實(shí)例與解析實(shí)例一:電視機(jī)工廠將原有的工廠進(jìn)行分割,為每種品牌的電視機(jī)提供一個(gè)子工廠,海爾工廠專(zhuān)門(mén)負(fù)責(zé)生產(chǎn)海爾電視機(jī),海信工廠專(zhuān)門(mén)負(fù)責(zé)生產(chǎn)海信電視機(jī),如果需要生產(chǎn)TCL電視機(jī)或創(chuàng)維電視機(jī),只需要對(duì)應(yīng)增加一個(gè)新的TCL工廠或創(chuàng)維工廠即可,原有的工廠無(wú)須做任何修改,使得整個(gè)系統(tǒng)具有更加的靈活性和可擴(kuò)展性。工廠方法模式模式實(shí)例與解析工廠方法模式模式實(shí)例與解析實(shí)例一:電視機(jī)工廠工廠方法模式模式實(shí)例與解析工廠方法模式模式實(shí)例與解析實(shí)例一:電視機(jī)工廠參考代碼(Chapter05FactoryMethod\sample01)演示……工廠方法模式模式實(shí)例與解析演示……工廠方法模式模式實(shí)例與解析實(shí)例二:日志記錄器某系統(tǒng)日志記錄器要求支持多種日志記錄方式,如文件記錄、數(shù)據(jù)庫(kù)記錄等,且用戶可以根據(jù)要求動(dòng)態(tài)選擇日志記錄方式,現(xiàn)使用工廠方法模式設(shè)計(jì)該系統(tǒng)。工廠方法模式模式實(shí)例與解析工廠方法模式模式實(shí)例與解析實(shí)例二:日志記錄器工廠方法模式模式實(shí)例與解析工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式的優(yōu)點(diǎn)在工廠方法模式中,工廠方法用來(lái)創(chuàng)建客戶所需要的產(chǎn)品,同時(shí)還向客戶隱藏了哪種具體產(chǎn)品類(lèi)將被實(shí)例化這一細(xì)節(jié),用戶只需要關(guān)心所需產(chǎn)品對(duì)應(yīng)的工廠,無(wú)須關(guān)心創(chuàng)建細(xì)節(jié),甚至無(wú)須知道具體產(chǎn)品類(lèi)的類(lèi)名?;诠S角色和產(chǎn)品角色的多態(tài)性設(shè)計(jì)是工廠方法模式的關(guān)鍵。它能夠使工廠可以自主確定創(chuàng)建何種產(chǎn)品對(duì)象,而如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)則完全封裝在具體工廠內(nèi)部。工廠方法模式之所以又被稱為多態(tài)工廠模式,是因?yàn)樗械木唧w工廠類(lèi)都具有同一抽象父類(lèi)。使用工廠方法模式的另一個(gè)優(yōu)點(diǎn)是在系統(tǒng)中加入新產(chǎn)品時(shí),無(wú)須修改抽象工廠和抽象產(chǎn)品提供的接口,無(wú)須修改客戶端,也無(wú)須修改其他的具體工廠和具體產(chǎn)品,而只要添加一個(gè)具體工廠和具體產(chǎn)品就可以了。這樣,系統(tǒng)的可擴(kuò)展性也就變得非常好,完全符合“開(kāi)閉原則”。工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式的缺點(diǎn)在添加新產(chǎn)品時(shí),需要編寫(xiě)新的具體產(chǎn)品類(lèi),而且還要提供與之對(duì)應(yīng)的具體工廠類(lèi),系統(tǒng)中類(lèi)的個(gè)數(shù)將成對(duì)增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,有更多的類(lèi)需要編譯和運(yùn)行,會(huì)給系統(tǒng)帶來(lái)一些額外的開(kāi)銷(xiāo)。由于考慮到系統(tǒng)的可擴(kuò)展性,需要引入抽象層,在客戶端代碼中均使用抽象層進(jìn)行定義,增加了系統(tǒng)的抽象性和理解難度,且在實(shí)現(xiàn)時(shí)可能需要用到DOM、反射等技術(shù),增加了系統(tǒng)的實(shí)現(xiàn)難度。工廠方法模式模式優(yōu)缺點(diǎn)工廠方法模式模式適用環(huán)境在以下情況下可以使用工廠方法模式:一個(gè)類(lèi)不知道它所需要的對(duì)象的類(lèi):在工廠方法模式中,客戶端不需要知道具體產(chǎn)品類(lèi)的類(lèi)名,只需要知道所對(duì)應(yīng)的工廠即可,具體的產(chǎn)品對(duì)象由具體工廠類(lèi)創(chuàng)建;客戶端需要知道創(chuàng)建具體產(chǎn)品的工廠類(lèi)。一個(gè)類(lèi)通過(guò)其子類(lèi)來(lái)指定創(chuàng)建哪個(gè)對(duì)象:在工廠方法模式中,對(duì)于抽象工廠類(lèi)只需要提供一個(gè)創(chuàng)建產(chǎn)品的接口,而由其子類(lèi)來(lái)確定具體要?jiǎng)?chuàng)建的對(duì)象,利用面向?qū)ο蟮亩鄳B(tài)性和里氏代換原則,在程序運(yùn)行時(shí),子類(lèi)對(duì)象將覆蓋父類(lèi)對(duì)象,從而使得系統(tǒng)更容易擴(kuò)展。將創(chuàng)建對(duì)象的任務(wù)委托給多個(gè)工廠子類(lèi)中的某一個(gè),客戶端在使用時(shí)可以無(wú)須關(guān)心是哪一個(gè)工廠子類(lèi)創(chuàng)建產(chǎn)品子類(lèi),需要時(shí)再動(dòng)態(tài)指定,可將具體工廠類(lèi)的類(lèi)名存儲(chǔ)在配置文件或數(shù)據(jù)庫(kù)中。工廠方法模式模式適用環(huán)境工廠方法模式模式應(yīng)用(1)java.util.Collection接口的iterator()方法:工廠方法模式模式應(yīng)用工廠方法模式模式應(yīng)用(2)Java消息服務(wù)JMS(JavaMessagingService)://使用上下文和JNDI得到連接工廠的引用,ctx是上下文Context類(lèi)型的對(duì)象QueueConnectionFactoryqConnFact=(QueueConnectionFactory)ctx.lookup("cfJndi");//使用連接工廠創(chuàng)建一個(gè)連接QueueConnectionqConn=qConnFact.createQueueConnection();//使用連接創(chuàng)建一個(gè)會(huì)話QueueSessionqSess=qConn.createQueueSession(false,javax.jms.QueueSession.AUTO_ACKNOWLEDGE);//使用上下文和JNDI得到消息隊(duì)列的引用Queueq=(Queue)ctx.lookup("myQueue");//使用連接創(chuàng)建一個(gè)需要發(fā)送的消息類(lèi)型的實(shí)例QueueSenderqSend=qSess.createSender(q);System.out.println("開(kāi)始發(fā)送消息......");工廠方法模式模式應(yīng)用//使用上下文和JNDI得到連接工廠的引工廠方法模式模式應(yīng)用(3)JDBC中的工廠方法:Connectionconn=DriverManager.getConnection("jdbc:microsoft:sq
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《倉(cāng)庫(kù)現(xiàn)場(chǎng)管理》課件
- 《倉(cāng)庫(kù)庫(kù)存管理系統(tǒng)》課件
- 《小學(xué)細(xì)節(jié)描寫(xiě)》課件
- 單位管理制度集粹選集員工管理篇
- 單位管理制度合并匯編【職員管理】
- 四川省南充市重點(diǎn)高中2024-2025學(xué)年高三上學(xué)期12月月考地理試卷含答案
- 單位管理制度分享合集職員管理篇十篇
- 單位管理制度范文大合集【人事管理】十篇
- 單位管理制度呈現(xiàn)大全職工管理篇十篇
- 《運(yùn)算律》教案(20篇)
- 產(chǎn)品經(jīng)理必備BP模板(中文版)
- 維西縣城市生活垃圾熱解處理工程環(huán)評(píng)報(bào)告
- GB/T 9128.2-2023鋼制管法蘭用金屬環(huán)墊第2部分:Class系列
- 網(wǎng)絡(luò)經(jīng)濟(jì)學(xué)PPT完整全套教學(xué)課件
- 2023年主治醫(yī)師(中級(jí))-臨床醫(yī)學(xué)檢驗(yàn)學(xué)(中級(jí))代碼:352考試參考題庫(kù)附帶答案
- 機(jī)械原理課程設(shè)計(jì)鎖梁自動(dòng)成型機(jī)床切削機(jī)構(gòu)
- 順產(chǎn)臨床路徑
- 人教版培智一年級(jí)上生活適應(yīng)教案
- 推動(dòng)架機(jī)械加工工序卡片
- RoHS檢測(cè)報(bào)告完整版
- 中國(guó)近現(xiàn)代史綱要(上海建橋?qū)W院)智慧樹(shù)知到答案章節(jié)測(cè)試2023年
評(píng)論
0/150
提交評(píng)論