




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、JAVA工廠(chǎng)方式工廠(chǎng)方式專(zhuān)門(mén)擔(dān)任將大量有共同接口的類(lèi)實(shí)例化。工廠(chǎng)方式可以動(dòng)態(tài)決議將哪一個(gè)類(lèi)實(shí)例化,不用事先知道每次要實(shí)例化哪一個(gè)類(lèi)。工廠(chǎng)方式的幾種形狀1簡(jiǎn)單工廠(chǎng)Simple Factory方式,又稱(chēng)靜態(tài)工廠(chǎng)方法方式Static Factory MethodPattern。2工廠(chǎng)方法Factory Method方式,又稱(chēng)多態(tài)性工廠(chǎng)Polymorphic Factory方式或虛擬構(gòu)造子Virtual Constructor方式;3籠統(tǒng)工廠(chǎng)Abstract Factory方式,又稱(chēng)工具箱Kit 或Toolkit方式。簡(jiǎn)單工廠(chǎng)實(shí)例比如說(shuō)有一個(gè)農(nóng)場(chǎng)公司,專(zhuān)門(mén)向市場(chǎng)銷(xiāo)售各類(lèi)水果。在這個(gè)系統(tǒng)里需求描畫(huà)以下的
2、水果:葡萄 Grape草莓 Strawberry蘋(píng)果 Apple水果與其他的植物有很大的不同,就是水果最終是可以采摘食用的。那么一個(gè)自然的作法就是建立一個(gè)各種水果都適用的接口,以便與農(nóng)場(chǎng)里的其他植物區(qū)分開(kāi)。代碼清單1:接口Fruit 的源代碼public interface Fruit/* 生長(zhǎng)*/void grow();/* 收獲*/void harvest();/* 種植*/void plant();代碼清單2:類(lèi)Apple 的源代碼public class Apple implements Fruitprivate int treeAge;public void grow()log(Ap
3、ple is growing.);public void harvest()log(Apple has been harvested.);public void plant()log(Apple has been planted.);public static void log(String msg)System.out.println(msg);public int getTreeAge()return treeAge;public void setTreeAge(int treeAge)this.treeAge = treeAge;代碼清單3:類(lèi)Grape 的源代碼public class
4、 Grape implements Fruitprivate boolean seedless;public void grow()log(Grape is growing.);public void harvest()log(Grape has been harvested.);public void plant()log(Grape has been planted.);public static void log(String msg)System.out.println(msg);public boolean getSeedless()return seedless;public vo
5、id setSeedless(boolean seedless)this.seedless = seedless;類(lèi)Strawberry 的源代碼public class Strawberry implements Fruit public void grow() System.out.println(Strawberry is growing.); public void harvest() System.out.println(Strawberry has been harvested.); public void plant() System.out.println(Strawberry
6、 has been planted.); FruitGardener 類(lèi)的源代碼public class FruitGardener public static Fruit factory(String which) throws BadFruitException if (which.equalsIgnoreCase(apple) return new Apple(); else if (which.equalsIgnoreCase(strawberry) return new Strawberry(); else if (which.equalsIgnoreCase(grape) retu
7、rn new Grape(); else throw new BadFruitException(Bad fruit request); 簡(jiǎn)單工廠(chǎng)方式的構(gòu)造工廠(chǎng)類(lèi)Creator角色:擔(dān)任這個(gè)角色的是工廠(chǎng)方法方式的中心,含有與運(yùn)用嚴(yán)密相關(guān)的商業(yè)邏輯。工廠(chǎng)類(lèi)在客戶(hù)端的直接調(diào)用下創(chuàng)建產(chǎn)品對(duì)象,它往往由一個(gè)詳細(xì)Java 類(lèi)實(shí)現(xiàn)。籠統(tǒng)產(chǎn)品Product角色:擔(dān)任這個(gè)角色的類(lèi)是工廠(chǎng)方法方式所創(chuàng)建的對(duì)象的父類(lèi),或它們共同擁有的接口?;\統(tǒng)產(chǎn)品角色可以用一個(gè)Java 接口或者Java 籠統(tǒng)類(lèi)實(shí)現(xiàn)。詳細(xì)產(chǎn)品Concrete Product角色:工廠(chǎng)方法方式所創(chuàng)建的任何對(duì)象都是這個(gè)角色的實(shí)例,詳細(xì)產(chǎn)品角色由一個(gè)詳細(xì)
8、Java 類(lèi)實(shí)現(xiàn)。Creator 類(lèi)的源代碼public class Creator public static Product factory() return new ConcreteProduct(); 籠統(tǒng)角色Product 接口的源代碼public interface Product詳細(xì)產(chǎn)品角色ConcreteProduct 類(lèi)的源代碼public class ConcreteProduct implements Productpublic ConcreteProduct()多層次的產(chǎn)品構(gòu)造簡(jiǎn)單方式的優(yōu)缺陷優(yōu)點(diǎn):方式的中心是工廠(chǎng)類(lèi)。這個(gè)類(lèi)含有必要的判別邏輯,可以決議在什么時(shí)候創(chuàng)建哪一
9、個(gè)產(chǎn)品類(lèi)的實(shí)例。而客戶(hù)端那么可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅擔(dān)任“消費(fèi)產(chǎn)品。簡(jiǎn)單工廠(chǎng)方式經(jīng)過(guò)這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割。缺陷一: 當(dāng)產(chǎn)品類(lèi)有復(fù)雜的多層次等級(jí)構(gòu)造時(shí),工廠(chǎng)類(lèi)只需它本人。以不變應(yīng)萬(wàn)變,就是方式的缺陷。 這個(gè)工廠(chǎng)類(lèi)集中了一切的產(chǎn)品創(chuàng)建邏輯,構(gòu)成一個(gè)無(wú)所不知的全能類(lèi),有人把這種類(lèi)叫做上帝類(lèi)God Class。假設(shè)這個(gè)全能類(lèi)代表的是農(nóng)場(chǎng)的一個(gè)詳細(xì)園丁的話(huà),那么這個(gè)園丁就需求對(duì)一切的產(chǎn)品擔(dān)任,成了農(nóng)場(chǎng)的關(guān)鍵人物,他什么時(shí)候不能正常任務(wù)了,整個(gè)農(nóng)場(chǎng)都要遭到影響。缺陷二: 當(dāng)產(chǎn)品類(lèi)有不同的接口種類(lèi)時(shí),工廠(chǎng)類(lèi)需求判別在什么時(shí)候創(chuàng)建某種產(chǎn)品。這種對(duì)時(shí)機(jī)的判別和對(duì)哪一種詳細(xì)產(chǎn)品的判別邏輯混合在
10、一同,使得系統(tǒng)在未來(lái)進(jìn)展功能擴(kuò)展時(shí)較為困難。缺陷三: 由于簡(jiǎn)單工廠(chǎng)方式運(yùn)用靜態(tài)方法作為工廠(chǎng)方法,而靜態(tài)方法無(wú)法由子類(lèi)承繼,因此,工廠(chǎng)角色無(wú)法構(gòu)成基于承繼的等級(jí)構(gòu)造。“開(kāi)閉原那么“開(kāi)閉原那么要求一個(gè)系統(tǒng)的設(shè)計(jì)可以允許系統(tǒng)在無(wú)需修正的情況下,擴(kuò)展其功能。簡(jiǎn)單工廠(chǎng)角色只在有限的程度上支持“開(kāi)閉原那么。工廠(chǎng)方法方式工廠(chǎng)方法方式的意圖是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠(chǎng)接口,將實(shí)踐創(chuàng)建任務(wù)推遲到子類(lèi)中。首先,在工廠(chǎng)方法方式中,中心的工廠(chǎng)類(lèi)不再擔(dān)任一切的產(chǎn)品的創(chuàng)建,而是將詳細(xì)創(chuàng)建的任務(wù)交給子類(lèi)去做。這個(gè)中心類(lèi)那么搖身一變,成為了一個(gè)籠統(tǒng)工廠(chǎng)角色,僅擔(dān)任給出詳細(xì)工廠(chǎng)子類(lèi)必需實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類(lèi)該當(dāng)被實(shí)例
11、化這種細(xì)節(jié)。工廠(chǎng)方法方式的構(gòu)造工廠(chǎng)方法方式的系統(tǒng)涉及到的角色籠統(tǒng)工廠(chǎng)Creator角色:擔(dān)任這個(gè)角色的是工廠(chǎng)方法方式的中心,它是與運(yùn)用程序無(wú)關(guān)的。任何在方式中創(chuàng)建對(duì)象的工廠(chǎng)類(lèi)必需實(shí)現(xiàn)這個(gè)接口。在上面的系統(tǒng)中這個(gè)角色由Java 接口Creator 扮演;在實(shí)踐的系統(tǒng)中,這個(gè)角色也經(jīng)常運(yùn)用籠統(tǒng)Java 類(lèi)實(shí)現(xiàn)。詳細(xì)工廠(chǎng)Concrete Creator角色:擔(dān)任這個(gè)角色的是實(shí)現(xiàn)了籠統(tǒng)工廠(chǎng)接口的詳細(xì)Java 類(lèi)。詳細(xì)工廠(chǎng)角色含有與運(yùn)用親密相關(guān)的邏輯,并且遭到運(yùn)用程序的調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。在本系統(tǒng)中給出了兩個(gè)這樣的角色,也就是詳細(xì)Java 類(lèi)ConcreteCreator1 和ConcreteCreat
12、or2。工廠(chǎng)方法方式的系統(tǒng)涉及到的角色籠統(tǒng)產(chǎn)品Product角色:工廠(chǎng)方法方式所創(chuàng)建的對(duì)象的超類(lèi)型,也就是產(chǎn)品對(duì)象的共同父類(lèi)或共同擁有的接口。在本系統(tǒng)中,這個(gè)角色由Java 接口Product 扮演;在實(shí)踐的系統(tǒng)中,這個(gè)角色也經(jīng)常運(yùn)用籠統(tǒng)Java 類(lèi)實(shí)現(xiàn)。詳細(xì)產(chǎn)品Concrete Product角色:這個(gè)角色實(shí)現(xiàn)了籠統(tǒng)產(chǎn)品角色所聲明的接口。工廠(chǎng)方法方式所創(chuàng)建的每一個(gè)對(duì)象都是某個(gè)詳細(xì)產(chǎn)品角色的實(shí)例。實(shí)例農(nóng)場(chǎng)工廠(chǎng)方法方式和簡(jiǎn)單工廠(chǎng)方式工廠(chǎng)方法方式的中心是一個(gè)籠統(tǒng)工廠(chǎng)類(lèi),而簡(jiǎn)單工廠(chǎng)方式把中心放在一個(gè)詳細(xì)類(lèi)上。工廠(chǎng)方法方式可以允許很多詳細(xì)工廠(chǎng)類(lèi)從籠統(tǒng)工廠(chǎng)類(lèi)中將創(chuàng)建行為承繼下來(lái),從而可以成為多個(gè)簡(jiǎn)單工廠(chǎng)
13、方式的綜合,進(jìn)而推行了簡(jiǎn)單工廠(chǎng)方式。工廠(chǎng)方法方式和簡(jiǎn)單工廠(chǎng)方式與簡(jiǎn)單工廠(chǎng)方式中的情形一樣的是,ConcreteCreator 的factory() 方法返還的數(shù)據(jù)類(lèi)型是一個(gè)籠統(tǒng)類(lèi)型Product,而不是哪一個(gè)詳細(xì)產(chǎn)品類(lèi)型,而客戶(hù)端也不用知道所得到的產(chǎn)品的真實(shí)類(lèi)型。這種多態(tài)性設(shè)計(jì)將工廠(chǎng)類(lèi)選擇創(chuàng)建哪一個(gè)產(chǎn)品對(duì)象、如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)完全封裝在詳細(xì)工廠(chǎng)類(lèi)內(nèi)部。對(duì)于添加新的產(chǎn)品類(lèi)而言,這個(gè)系統(tǒng)完全支持“開(kāi)-閉原那么?;\統(tǒng)工廠(chǎng)方式籠統(tǒng)工廠(chǎng)方式與工廠(chǎng)方法方式的區(qū)別籠統(tǒng)工廠(chǎng)方式與工廠(chǎng)方法方式的最大區(qū)別就在于,工廠(chǎng)方法方式針對(duì)的是一個(gè)產(chǎn)品等級(jí)構(gòu)造;而籠統(tǒng)工廠(chǎng)方式那么需求面對(duì)多個(gè)產(chǎn)品等級(jí)構(gòu)造?;\統(tǒng)工廠(chǎng)方式的構(gòu)
14、造籠統(tǒng)工廠(chǎng)方式GOF95是對(duì)象的創(chuàng)建方式,它是工廠(chǎng)方法方式的進(jìn)一步推行。假設(shè)一個(gè)子系統(tǒng)需求一些產(chǎn)品對(duì)象,而這些產(chǎn)品又屬于一個(gè)以上的產(chǎn)品等級(jí)構(gòu)造。那么為了將消費(fèi)這些產(chǎn)品對(duì)象的責(zé)任和創(chuàng)建這些產(chǎn)品對(duì)象的責(zé)任分割開(kāi)來(lái),可以引進(jìn)籠統(tǒng)工廠(chǎng)方式。這樣的話(huà),消費(fèi)產(chǎn)品的一方不需求直接參與產(chǎn)品的創(chuàng)建任務(wù),而只需求向一個(gè)公用的工廠(chǎng)接口懇求所需求的產(chǎn)品。下面就以一個(gè)表示性的系統(tǒng)為例,闡明這個(gè)方式的構(gòu)造。產(chǎn)品構(gòu)造A和B系統(tǒng)類(lèi)圖籠統(tǒng)工廠(chǎng)方式涉及到的角色籠統(tǒng)工廠(chǎng)AbstractFactory角色:擔(dān)任這個(gè)角色的是工廠(chǎng)方法方式的中心,它是與運(yùn)用系統(tǒng)的商業(yè)邏輯無(wú)關(guān)的。通常運(yùn)用Java 接口或者籠統(tǒng)Java 類(lèi)實(shí)現(xiàn),而一切的詳細(xì)
15、工廠(chǎng)類(lèi)必需實(shí)現(xiàn)這個(gè)Java 接口或承繼這個(gè)籠統(tǒng)Java 類(lèi)。詳細(xì)工廠(chǎng)類(lèi)Conrete Factory角色:這個(gè)角色直接在客戶(hù)端的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色含有選擇適宜的產(chǎn)品對(duì)象的邏輯,而這個(gè)邏輯是與運(yùn)用系統(tǒng)的商業(yè)邏輯嚴(yán)密相關(guān)的。通常運(yùn)用詳細(xì)Java 類(lèi)實(shí)現(xiàn)這個(gè)角色?;\統(tǒng)工廠(chǎng)方式涉及到的角色籠統(tǒng)產(chǎn)品Abstract Product角色:擔(dān)任這個(gè)角色的類(lèi)是工廠(chǎng)方法方式所創(chuàng)建的對(duì)象的父類(lèi),或它們共同擁有的接口。通常運(yùn)用Java 接口或者籠統(tǒng)Java 類(lèi)實(shí)現(xiàn)這一角色。詳細(xì)產(chǎn)品Concrete Product角色:籠統(tǒng)工廠(chǎng)方式所創(chuàng)建的任何產(chǎn)品對(duì)象都是某一個(gè)詳細(xì)產(chǎn)品類(lèi)的實(shí)例。這是客戶(hù)端最終需求的東西,其內(nèi)部一定充溢了運(yùn)用系統(tǒng)的商業(yè)邏輯。通常運(yùn)用詳細(xì)Java 類(lèi)實(shí)現(xiàn)這個(gè)角色。普通而言,有多少個(gè)產(chǎn)品等級(jí)構(gòu)造,就會(huì)在工廠(chǎng)角色中發(fā)現(xiàn)多少個(gè)工廠(chǎng)方法。每一個(gè)產(chǎn)品等級(jí)構(gòu)造中有多少詳細(xì)產(chǎn)品,就有多少個(gè)產(chǎn)品族,也就會(huì)在工廠(chǎng)等級(jí)構(gòu)造中發(fā)現(xiàn)多少個(gè)詳細(xì)工
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 多項(xiàng)式合并與去括號(hào)課件教程
- 公司法務(wù)管理與知識(shí)產(chǎn)權(quán)策略課件
- 診斷學(xué)基礎(chǔ)模擬題含答案(附解析)
- 小螞蟻兒童創(chuàng)意美術(shù)課件
- 營(yíng)林機(jī)械在災(zāi)害防治中的作用考核試卷
- 智能物流車(chē)設(shè)計(jì)
- 森林火災(zāi)心理干預(yù)考核試卷
- 《大數(shù)據(jù)處理技術(shù):Hadoop培訓(xùn)》課件
- 羽毛球運(yùn)動(dòng)器材及配件制造考核試卷
- 展館設(shè)計(jì)案例分析
- 中學(xué)理化生數(shù)字化實(shí)驗(yàn)室建設(shè)方案
- 土方車(chē)隊(duì)運(yùn)輸居間合同范文
- 黏多糖貯積癥Ⅲ型的臨床護(hù)理
- 護(hù)理不良事件根本原因RCA分析-中醫(yī)熱奄包治療燙傷
- 2024年高考物理試題(廣東卷) 含答案
- 2024秋期國(guó)家開(kāi)放大學(xué)專(zhuān)科《液壓與氣壓傳動(dòng)》一平臺(tái)在線(xiàn)形考(形考任務(wù)+實(shí)驗(yàn)報(bào)告)試題答案
- 《預(yù)裝式變電站》課件
- 推拿店合同范例
- 2024年高考真題-物理(貴州卷) 含解析
- 新能源技術(shù)投資風(fēng)險(xiǎn)評(píng)估與管理策略考核試卷
- 交通運(yùn)輸行業(yè)研發(fā)中心申報(bào)書(shū)
評(píng)論
0/150
提交評(píng)論