工廠模式JAVAppt課件_第1頁
工廠模式JAVAppt課件_第2頁
工廠模式JAVAppt課件_第3頁
工廠模式JAVAppt課件_第4頁
工廠模式JAVAppt課件_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、JAVA工廠方式工廠方式專門擔(dān)任將大量有共同接口的類實(shí)例化。工廠方式可以動(dòng)態(tài)決議將哪一個(gè)類實(shí)例化,不用事先知道每次要實(shí)例化哪一個(gè)類。工廠方式的幾種形狀1簡單工廠Simple Factory方式,又稱靜態(tài)工廠方法方式Static Factory MethodPattern。2工廠方法Factory Method方式,又稱多態(tài)性工廠Polymorphic Factory方式或虛擬構(gòu)造子Virtual Constructor方式;3籠統(tǒng)工廠Abstract Factory方式,又稱工具箱Kit 或Toolkit方式。簡單工廠實(shí)例比如說有一個(gè)農(nóng)場公司,專門向市場銷售各類水果。在這個(gè)系統(tǒng)里需求描畫以下的

2、水果:葡萄 Grape草莓 Strawberry蘋果 Apple水果與其他的植物有很大的不同,就是水果最終是可以采摘食用的。那么一個(gè)自然的作法就是建立一個(gè)各種水果都適用的接口,以便與農(nóng)場里的其他植物區(qū)分開。代碼清單1:接口Fruit 的源代碼public interface Fruit/* 生長*/void grow();/* 收獲*/void harvest();/* 種植*/void plant();代碼清單2:類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:類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;類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 類的源代碼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); 簡單工廠方式的構(gòu)造工廠類Creator角色:擔(dān)任這個(gè)角色的是工廠方法方式的中心,含有與運(yùn)用嚴(yán)密相關(guān)的商業(yè)邏輯。工廠類在客戶端的直接調(diào)用下創(chuàng)建產(chǎn)品對(duì)象,它往往由一個(gè)詳細(xì)Java 類實(shí)現(xiàn)?;\統(tǒng)產(chǎn)品Product角色:擔(dān)任這個(gè)角色的類是工廠方法方式所創(chuàng)建的對(duì)象的父類,或它們共同擁有的接口?;\統(tǒng)產(chǎn)品角色可以用一個(gè)Java 接口或者Java 籠統(tǒng)類實(shí)現(xiàn)。詳細(xì)產(chǎn)品Concrete Product角色:工廠方法方式所創(chuàng)建的任何對(duì)象都是這個(gè)角色的實(shí)例,詳細(xì)產(chǎn)品角色由一個(gè)詳細(xì)

8、Java 類實(shí)現(xiàn)。Creator 類的源代碼public class Creator public static Product factory() return new ConcreteProduct(); 籠統(tǒng)角色Product 接口的源代碼public interface Product詳細(xì)產(chǎn)品角色ConcreteProduct 類的源代碼public class ConcreteProduct implements Productpublic ConcreteProduct()多層次的產(chǎn)品構(gòu)造簡單方式的優(yōu)缺陷優(yōu)點(diǎn):方式的中心是工廠類。這個(gè)類含有必要的判別邏輯,可以決議在什么時(shí)候創(chuàng)建哪一

9、個(gè)產(chǎn)品類的實(shí)例。而客戶端那么可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅擔(dān)任“消費(fèi)產(chǎn)品。簡單工廠方式經(jīng)過這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割。缺陷一: 當(dāng)產(chǎn)品類有復(fù)雜的多層次等級(jí)構(gòu)造時(shí),工廠類只需它本人。以不變應(yīng)萬變,就是方式的缺陷。 這個(gè)工廠類集中了一切的產(chǎn)品創(chuàng)建邏輯,構(gòu)成一個(gè)無所不知的全能類,有人把這種類叫做上帝類God Class。假設(shè)這個(gè)全能類代表的是農(nóng)場的一個(gè)詳細(xì)園丁的話,那么這個(gè)園丁就需求對(duì)一切的產(chǎn)品擔(dān)任,成了農(nóng)場的關(guān)鍵人物,他什么時(shí)候不能正常任務(wù)了,整個(gè)農(nóng)場都要遭到影響。缺陷二: 當(dāng)產(chǎn)品類有不同的接口種類時(shí),工廠類需求判別在什么時(shí)候創(chuàng)建某種產(chǎn)品。這種對(duì)時(shí)機(jī)的判別和對(duì)哪一種詳細(xì)產(chǎn)品的判別邏輯混合在

10、一同,使得系統(tǒng)在未來進(jìn)展功能擴(kuò)展時(shí)較為困難。缺陷三: 由于簡單工廠方式運(yùn)用靜態(tài)方法作為工廠方法,而靜態(tài)方法無法由子類承繼,因此,工廠角色無法構(gòu)成基于承繼的等級(jí)構(gòu)造?!伴_閉原那么“開閉原那么要求一個(gè)系統(tǒng)的設(shè)計(jì)可以允許系統(tǒng)在無需修正的情況下,擴(kuò)展其功能。簡單工廠角色只在有限的程度上支持“開閉原那么。工廠方法方式工廠方法方式的意圖是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)踐創(chuàng)建任務(wù)推遲到子類中。首先,在工廠方法方式中,中心的工廠類不再擔(dān)任一切的產(chǎn)品的創(chuàng)建,而是將詳細(xì)創(chuàng)建的任務(wù)交給子類去做。這個(gè)中心類那么搖身一變,成為了一個(gè)籠統(tǒng)工廠角色,僅擔(dān)任給出詳細(xì)工廠子類必需實(shí)現(xiàn)的接口,而不接觸哪一個(gè)產(chǎn)品類該當(dāng)被實(shí)例

11、化這種細(xì)節(jié)。工廠方法方式的構(gòu)造工廠方法方式的系統(tǒng)涉及到的角色籠統(tǒng)工廠Creator角色:擔(dān)任這個(gè)角色的是工廠方法方式的中心,它是與運(yùn)用程序無關(guān)的。任何在方式中創(chuàng)建對(duì)象的工廠類必需實(shí)現(xiàn)這個(gè)接口。在上面的系統(tǒng)中這個(gè)角色由Java 接口Creator 扮演;在實(shí)踐的系統(tǒng)中,這個(gè)角色也經(jīng)常運(yùn)用籠統(tǒng)Java 類實(shí)現(xiàn)。詳細(xì)工廠Concrete Creator角色:擔(dān)任這個(gè)角色的是實(shí)現(xiàn)了籠統(tǒng)工廠接口的詳細(xì)Java 類。詳細(xì)工廠角色含有與運(yùn)用親密相關(guān)的邏輯,并且遭到運(yùn)用程序的調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。在本系統(tǒng)中給出了兩個(gè)這樣的角色,也就是詳細(xì)Java 類ConcreteCreator1 和ConcreteCreat

12、or2。工廠方法方式的系統(tǒng)涉及到的角色籠統(tǒng)產(chǎn)品Product角色:工廠方法方式所創(chuàng)建的對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口。在本系統(tǒng)中,這個(gè)角色由Java 接口Product 扮演;在實(shí)踐的系統(tǒng)中,這個(gè)角色也經(jīng)常運(yùn)用籠統(tǒng)Java 類實(shí)現(xiàn)。詳細(xì)產(chǎn)品Concrete Product角色:這個(gè)角色實(shí)現(xiàn)了籠統(tǒng)產(chǎn)品角色所聲明的接口。工廠方法方式所創(chuàng)建的每一個(gè)對(duì)象都是某個(gè)詳細(xì)產(chǎn)品角色的實(shí)例。實(shí)例農(nóng)場工廠方法方式和簡單工廠方式工廠方法方式的中心是一個(gè)籠統(tǒng)工廠類,而簡單工廠方式把中心放在一個(gè)詳細(xì)類上。工廠方法方式可以允許很多詳細(xì)工廠類從籠統(tǒng)工廠類中將創(chuàng)建行為承繼下來,從而可以成為多個(gè)簡單工廠

13、方式的綜合,進(jìn)而推行了簡單工廠方式。工廠方法方式和簡單工廠方式與簡單工廠方式中的情形一樣的是,ConcreteCreator 的factory() 方法返還的數(shù)據(jù)類型是一個(gè)籠統(tǒng)類型Product,而不是哪一個(gè)詳細(xì)產(chǎn)品類型,而客戶端也不用知道所得到的產(chǎn)品的真實(shí)類型。這種多態(tài)性設(shè)計(jì)將工廠類選擇創(chuàng)建哪一個(gè)產(chǎn)品對(duì)象、如何創(chuàng)建這個(gè)對(duì)象的細(xì)節(jié)完全封裝在詳細(xì)工廠類內(nèi)部。對(duì)于添加新的產(chǎn)品類而言,這個(gè)系統(tǒng)完全支持“開-閉原那么。籠統(tǒng)工廠方式籠統(tǒng)工廠方式與工廠方法方式的區(qū)別籠統(tǒng)工廠方式與工廠方法方式的最大區(qū)別就在于,工廠方法方式針對(duì)的是一個(gè)產(chǎn)品等級(jí)構(gòu)造;而籠統(tǒng)工廠方式那么需求面對(duì)多個(gè)產(chǎn)品等級(jí)構(gòu)造?;\統(tǒng)工廠方式的構(gòu)

14、造籠統(tǒng)工廠方式GOF95是對(duì)象的創(chuà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é)任分割開來,可以引進(jìn)籠統(tǒng)工廠方式。這樣的話,消費(fèi)產(chǎn)品的一方不需求直接參與產(chǎn)品的創(chuàng)建任務(wù),而只需求向一個(gè)公用的工廠接口懇求所需求的產(chǎn)品。下面就以一個(gè)表示性的系統(tǒng)為例,闡明這個(gè)方式的構(gòu)造。產(chǎn)品構(gòu)造A和B系統(tǒng)類圖籠統(tǒng)工廠方式涉及到的角色籠統(tǒng)工廠AbstractFactory角色:擔(dān)任這個(gè)角色的是工廠方法方式的中心,它是與運(yùn)用系統(tǒng)的商業(yè)邏輯無關(guān)的。通常運(yùn)用Java 接口或者籠統(tǒng)Java 類實(shí)現(xiàn),而一切的詳細(xì)

15、工廠類必需實(shí)現(xiàn)這個(gè)Java 接口或承繼這個(gè)籠統(tǒng)Java 類。詳細(xì)工廠類Conrete Factory角色:這個(gè)角色直接在客戶端的調(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 類實(shí)現(xiàn)這個(gè)角色?;\統(tǒng)工廠方式涉及到的角色籠統(tǒng)產(chǎn)品Abstract Product角色:擔(dān)任這個(gè)角色的類是工廠方法方式所創(chuàng)建的對(duì)象的父類,或它們共同擁有的接口。通常運(yùn)用Java 接口或者籠統(tǒng)Java 類實(shí)現(xiàn)這一角色。詳細(xì)產(chǎn)品Concrete Product角色:籠統(tǒng)工廠方式所創(chuàng)建的任何產(chǎn)品對(duì)象都是某一個(gè)詳細(xì)產(chǎn)品類的實(shí)例。這是客戶端最終需求的東西,其內(nèi)部一定充溢了運(yùn)用系統(tǒng)的商業(yè)邏輯。通常運(yùn)用詳細(xì)Java 類實(shí)現(xiàn)這個(gè)角色。普通而言,有多少個(gè)產(chǎn)品等級(jí)構(gòu)造,就會(huì)在工廠角色中發(fā)現(xiàn)多少個(gè)工廠方法。每一個(gè)產(chǎn)品等級(jí)構(gòu)造中有多少詳細(xì)產(chǎn)品,就有多少個(gè)產(chǎn)品族,也就會(huì)在工廠等級(jí)構(gòu)造中發(fā)現(xiàn)多少個(gè)詳細(xì)工

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論