java設(shè)計模式第4講抽象工廠jzkangta_第1頁
java設(shè)計模式第4講抽象工廠jzkangta_第2頁
java設(shè)計模式第4講抽象工廠jzkangta_第3頁
java設(shè)計模式第4講抽象工廠jzkangta_第4頁
java設(shè)計模式第4講抽象工廠jzkangta_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

《Java與模式》作者博 電子工第14章抽象工廠 在閱讀本章之前,請首先閱讀本書的“簡單工廠(SimpleFactory)模式”以及“工廠方法(FactoryMethod)模式”兩章。 一個系統(tǒng)需要消費多個抽象產(chǎn)品角色,這些抽象產(chǎn)品角色可以用Java接口或者抽象但是,正如上面所的,這些抽象產(chǎn)品角色是由Java接口或者抽象Java類實現(xiàn)的, 為了方便引進抽象工廠模式,特地引進一個新的概念:產(chǎn)品族(ProductFamily。所應(yīng)當?shù)氖?,雖然大多數(shù)的文獻都以一個含有兩個層次(抽象和具體層次)的產(chǎn)品抽象工廠模式[GOF95]是對象的創(chuàng)建模式,它是工廠方法模式的進一步推廣。產(chǎn)品對象創(chuàng)建問題。比如下面就是兩個具有相同等級結(jié)構(gòu)的A和產(chǎn)品等級B的 如果使用相圖描述的話,會看到在相圖上出現(xiàn)兩個等級結(jié)構(gòu)A和B,以及兩個產(chǎn)品族1和2。如下圖所示。象工廠角色Creator中加以。產(chǎn)品等級結(jié)構(gòu)A和產(chǎn)品等級結(jié)構(gòu)B的結(jié)構(gòu)圖如下所示。抽象工廠(Factory)角色:擔任這個角色的是工廠方法模式的,它是與應(yīng)用系統(tǒng)的商業(yè)邏輯無關(guān)的。通常使用Java接口或者抽象Java類實現(xiàn),而所有的具體工廠類必須實現(xiàn)這個Java接口或繼承這個抽象Java類。業(yè)邏輯緊密相關(guān)的。通常使用具體Java類實現(xiàn)這個角色。抽象產(chǎn)品(Product)角色:擔任這個角色的類是工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。通常使用Java接口或者抽象Java類實現(xiàn)這具體產(chǎn)品(ConcreteProduct)角色:抽象工廠模式所創(chuàng)建的任何產(chǎn)品對象都是某統(tǒng)的商業(yè)邏輯。通常使用具體Java類實現(xiàn)這個角色。packagecom.javapatterns. publicinterfaceCreator{*產(chǎn)品等級結(jié)構(gòu)A的工廠方publicProductA*產(chǎn)品等級結(jié)的工廠方publicProductB}package publicclassConcreteCreator1implements{*產(chǎn)品等級結(jié)構(gòu)A的工廠方publicProductA{returnnew}*產(chǎn)品等級結(jié)的工廠方publicProductB{returnnew}}package publicclassConcreteCreator2implements{*產(chǎn)品等級結(jié)構(gòu)A的工廠方publicProductA{returnnew}*產(chǎn)品等級結(jié)的工廠方publicProductB{returnnew}}象產(chǎn)品角色是由一個Java接口實現(xiàn)的。packagecom.javapatterns. publicinterfaceProductA{}產(chǎn)品等級結(jié)構(gòu)A的抽象產(chǎn)品接口。packagecom.javapatterns. publicclassProductA1implementsProductA{public{}}實現(xiàn)了產(chǎn)品等級結(jié)構(gòu)A的抽象產(chǎn)品接口。packagecom.javapatterns. publicclassProductA2implementsProductA{public{}}packagecom.javapatterns. publicinterfaceProductB{}題:Java接口”一章產(chǎn)品等級結(jié)構(gòu)B的抽象產(chǎn)品接口。packagecom.javapatterns. publicclassProductB1implementsProductB{*public{}}產(chǎn)品等級結(jié)構(gòu)B的抽象產(chǎn)品接口。packagecom.javapatterns. publicclassProductB2implementsProductB{*public{}}文獻[GOF95],在以下情況下應(yīng)當考慮使用抽象工廠模式Windows操作系統(tǒng)的視窗環(huán)境中,這兩個構(gòu)件有不同的本地實現(xiàn),它們的細節(jié)也有所不在每一個操作系統(tǒng)中,都有一個視窗構(gòu)件組成的構(gòu)件。在這里就是Button和Text可以發(fā)現(xiàn)在上面的產(chǎn)品類圖中,有兩個產(chǎn)品的等級結(jié)構(gòu),分別是Button等級結(jié)構(gòu)和Text等級結(jié)構(gòu)。同時有兩個產(chǎn)品族,也就是UNIX產(chǎn)品族和Windows產(chǎn)品族。UNIX產(chǎn)品族由UnixButtonUnixText產(chǎn)品構(gòu)成Windows產(chǎn)品族WinButtonWinText產(chǎn)品構(gòu)成。UnixFactoryWinFactoryUnixFactoryUnix產(chǎn)品族中的產(chǎn)品,而章中曾經(jīng)仔細討論過一個農(nóng)場公司從小到大的發(fā)展過程。而如今,農(nóng)場公司再次新的因此,在這個系統(tǒng)里面,產(chǎn)品分成兩個等級結(jié)構(gòu):水果(Fruit)和蔬菜(eggie。下下面則是蔬菜(Veggie)的類圖Tropical和Northern。坐標圖上出現(xiàn)了四個坐標點,分別代表TropicalFruit(熱帶水果、TropicalVeggie(熱帶蔬菜、NorthernFruit(北方水果)NorthernVeggie(北方蔬菜)代碼10:接口publicinterfaceGardenerNorthernGardenerTropicalGardener均是抽象工廠類Gardener代碼11:具體工廠類packagecom.javapatterns. factoryfarm;publicclassNorthernGardenerimplementsGardener{*publicFruitcreateFruit(String{returnnew}*{returnnew}}代碼12:具體工廠類TropicalGardenerpackagecom.javapatterns. factoryfarm;publicclassTropicalGardenerimplementsGardener{*publicFruitcreateFruit(String{returnnew}*{returnnew}}代碼13:接口Veggie代碼14:具體產(chǎn)品類NorthernVeggiepackagecom.javapatterns. factoryfarm;publicclassNorthernVeggieimplementsVeggie{privateString{}publicString{return}publicvoidsetName(String{=}}代碼15:具體產(chǎn)品類TropicalVeggie{privateString*{=}publicString{return}publicvoidsetName(String{=}}代碼16:抽象產(chǎn)品角色Fruit的源代碼packagecom.javapatterns. publicinterfaceFruit{}代碼17:抽象產(chǎn)品角色NorthernFruit的源代碼packagecom.javapatterns. publicclassNorthernFruitimplementsFruit{privateStringpublicNorthernFruit(String{}publicString{return}publicvoidsetName(String{=}}代碼18:抽象產(chǎn)品角色TropicalFruit的源代碼packagecom.javapatterns. publicclassTropicalFruitimplementsFruit{privateString{}publicString{return}publicvoidsetName(String{=}}PCIBMIBM克隆機系列;另一個系列是MAC,或MacIntosh系列。產(chǎn)品等級結(jié)構(gòu)也有兩個,一個是RAM,另一個是CPU。NorthernGardenerTropicalGardener的一個實例就可以了。在計算機生產(chǎn)的例子中,PcProducerMacProducer也分別只需要一個實例。因在本書的“簡單工廠(SimpleFactory)模式”一章中,曾經(jīng)談到在簡單工廠模式中,java.util.DateFormat為例子講解這一做法。如下JavaAWT義了兩套平行的等Java的構(gòu)件Componentpeer構(gòu)件ComponentPeer為超類。Java構(gòu)件Java程序提供java.awt.Toolkit類;這個抽象類在不同的操作系統(tǒng)中有不同的具體子類,并為每一個peer構(gòu)件提供了相應(yīng)的工廠方法,以創(chuàng)建并且返還一個peer構(gòu)件的實例。下面的圖顯示了Java構(gòu)件Button通過調(diào)用Toolkit工廠對象創(chuàng)建一個ButtonPeer對象的情況。ButtonButtonPeer的通訊圖。ButtonJavaToolkit對象與peer構(gòu)件通訊。在這個結(jié)構(gòu)中,Toolkit就是抽象工廠角色,它的具體實現(xiàn)是具體工廠本章后面的附錄“附錄:JavaAWTPeer架構(gòu)與抽象工廠模式”,以及本書的“橋梁(Bridge) 應(yīng)用到了創(chuàng)造各種動物身上。可以想到,把繩子攪到泥水里,然后把沾滿泥水的繩的陰繩造出的是女人和雌動物,陽繩造出的是和雄動物。讀者可以看出,造物用的是抽象工廠模式。在這個故事里面,的“產(chǎn)品”有劃分。的繩子按照陰、陽劃分,產(chǎn)品則按照人、獸劃分。造萬物系統(tǒng)里陰、陽兩生產(chǎn)系統(tǒng)的具體工廠類按照這一方案改造,給出UML類圖和源代碼。ComputerProducergetProducer()的下劃線,表明代碼19:抽象類ComputerProducer的方法getProducer(Stringpublicclass{publicstaticComputerProducergetProducer(String{if{returnnew}elseif{}{}}}

returnnewreturn是靜態(tài)的。MacProducerPcProducer的構(gòu)造子是私有的,因此,這兩個類必須自己將自代碼20:抽象工廠類ComputerProducerpublicclass{publicstaticComputerProducergetInstance(String{if{return}elseif{return}}}代碼21:具體工廠類MacProducer是單例publicclassMacProducerextends{privatestaticMacProducerm_MacProducer=newMacProducer();*private{}*publicCpu{returnnewMa}*publicRam{returnnew}*publicstaticMacProducer{return}}publicclassPcProducerextends{privatestaticPcProducerm_PcProducer=newPcProducer();*private{}*publicCpu{returnnewP}*publicRam{returnnew}*publicstaticPcProducer{return}}[ZUKOWSKI97]JohnZukowski,JavaAWTReference,publishedbyO'Reilly,在“抽象工廠(Factory)模式”一章中的“抽象工廠模式的”一節(jié)中,本書使際上,在Java語言的AWT確實使用了抽象工廠模式創(chuàng)建分屬于不同操作系統(tǒng)的peer構(gòu)本節(jié)就對AWT這個庫,特別是庫中的Toolkit類及其子類作一個,以說明抽象工廠模式是怎么應(yīng)用到AWT庫中的。PeerJava程序總是顯示所在操作系統(tǒng)的視感(LookandFeelJavaPeerJavaToolkit接口,負責peer對象的創(chuàng)建。這種三重接口的架構(gòu),叫做Peer架構(gòu);顯然,Peer架構(gòu)是橋梁在運行時,Peer架構(gòu)會自行調(diào)用這個Toolkit對象,創(chuàng)建出所需要的peer對象。上面的結(jié)構(gòu)圖分成上下兩個部分,下方的部分給出的就是java.awt.peers庫中所有的產(chǎn)品角色與Peer在下圖中,顯示了兩個產(chǎn)品等級結(jié)構(gòu),即ButtonPeerLabelPeer等級結(jié)構(gòu);以及三個Windows產(chǎn)品族,Solaris/Motif產(chǎn)品族,以及Unix/OpenWin產(chǎn)品族。實際上,要想收集到所有的產(chǎn)品族的產(chǎn)品(ZButton,WButtonMButton等分Windows,Unix/OpenWin,以Solaris/Motifpeer構(gòu)件JDKpeer構(gòu)件。java.awt.Toolkit。JavaToolkit的具體子類。讀者可以看出,圖中顯示的三個Toolkit的具體子類分別對應(yīng)于三個不同的操作環(huán)境;而如果添加上Macintosh的話,就應(yīng)當再加上一個Toolkit的具體子類(應(yīng)當是sun.awt.acos.Moolkit。從上面的圖可以Toolkit對象位于工廠等級結(jié)構(gòu)中,負

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論