Android之大話(huà)設(shè)計(jì)模式——第一章簡(jiǎn)單工廠模式.docx_第1頁(yè)
Android之大話(huà)設(shè)計(jì)模式——第一章簡(jiǎn)單工廠模式.docx_第2頁(yè)
Android之大話(huà)設(shè)計(jì)模式——第一章簡(jiǎn)單工廠模式.docx_第3頁(yè)
Android之大話(huà)設(shè)計(jì)模式——第一章簡(jiǎn)單工廠模式.docx_第4頁(yè)
Android之大話(huà)設(shè)計(jì)模式——第一章簡(jiǎn)單工廠模式.docx_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

簡(jiǎn)單工廠模式一見(jiàn)鐘情的代價(jià)簡(jiǎn)單工廠模式應(yīng)用場(chǎng)景舉例: “你知不知道大學(xué)的規(guī)矩啊?”,MM有些不滿(mǎn)的問(wèn)道?!笆裁匆?guī)矩?當(dāng)然不知道了啊。”,GG傻傻的說(shuō)道,很明顯這個(gè)MM已經(jīng)對(duì)GG的不懂事和不主動(dòng)有些不滿(mǎn)了?!霸诖髮W(xué)里,當(dāng)兩個(gè)人確定戀愛(ài)關(guān)系時(shí),都是要請(qǐng)女朋友同寢室的人去吃飯的”,MM帶著一些不滿(mǎn)又有一些撒嬌的口氣說(shuō)道。“???我不知道哎,請(qǐng)眾美女吃飯我還求之不得呢,什么時(shí)候有時(shí)間啊,確定是時(shí)間和地點(diǎn),我隨叫隨到!”GG很激動(dòng)很爽快的答應(yīng)道。MM笑著抬頭看了一樣這個(gè)傻GG,“那好,讓我想想,我們我們下周六下午有時(shí)間,要么這樣,你帶我們?nèi)湲?dāng)勞吧”,“一言為定”,“那我們?cè)谙轮芰挛缥妩c(diǎn)在中心商業(yè)街南邊的麥當(dāng)勞分店見(jiàn),聽(tīng)說(shuō)那邊的口味還不錯(cuò):-O”,“好的,只要你開(kāi)心就好,不見(jiàn)不散”GG回答道,“不見(jiàn)不散!”MM就這樣嫣然一笑的歡天喜地的離開(kāi)了。 想想前幾天GG和MM因?yàn)榉浅E既坏囊蛩叵嘁?jiàn)的情景,GG再次涌起了一種無(wú)法言喻的幸福和激動(dòng)。那一天,GG見(jiàn)到了MM,仿若晴天霹靂,整個(gè)地球在顫抖,她甜美而柔和的聲音、她極具古典氣息的是秀發(fā)、她超棒的身材、她恰到好處的著裝、她極盡秀美而恬靜的嬌容、她似音樂(lè)般的舉止頓時(shí)令他徹底的迷醉了,仿佛整個(gè)世界只有她一人,仿佛一切都是為她而生的,突然,兩人目光交錯(cuò),眼神相遇就這么一見(jiàn)鐘情!GG想,到麥當(dāng)勞也好,反正我不會(huì)做飯,再說(shuō)了,即使會(huì)做也不能去做啊,眾口難調(diào)啊,更何況是一群美女,到麥當(dāng)勞讓她們自個(gè)兒去挑吧_不過(guò)我這一個(gè)月的生活費(fèi)怕是要泡湯了,難怪別人說(shuō)大學(xué)里最高的消費(fèi)是花費(fèi)的女朋友身上的消費(fèi)(_) 千呼萬(wàn)喚,終于到了周六下午。被感情沖昏大腦的GG突然間變的不再那么笨了,這次他提前預(yù)定了座位,是一個(gè)可以容納8個(gè)人的座位。而且具體告訴了MM座位的位置,這樣大家都清楚位置是比較好的,避免了到時(shí)候沒(méi)有位置的尷尬。趕往麥當(dāng)勞路上的GG心潮澎湃但是有些擔(dān)心,畢竟要面對(duì)六個(gè)美女,而且女朋友也是剛認(rèn)識(shí)幾天?!坝H愛(ài)的,現(xiàn)在到哪了?”手機(jī)中MM發(fā)過(guò)來(lái)了一條短信,GG一看時(shí)間,天啊,光顧著去傻想,還有幾分鐘就五點(diǎn)了,第一次如果都遲到那就太不好了,于是立即回復(fù)到,“寶貝兒,我就到了!”,因?yàn)辂湲?dāng)勞就在對(duì)面,抬頭就可以看到的。GG跑上了麥當(dāng)勞的二樓的用餐處,見(jiàn)到諸位美女,緊張的還沒(méi)說(shuō)不話(huà)來(lái),“這是我男朋友”MM拽著GG的手臂說(shuō),“大家好,大家好”,GG緊張的說(shuō)道。忙又補(bǔ)充到:“我們先點(diǎn)餐,大家自便,都不要客氣啊”,“我要吃雞翅”,“我要麥香魚(yú)套餐”,我要“板燒雞腿套餐”,我要“奶昔”,我要“薯?xiàng)l”,大家都點(diǎn)好自己的喜歡的食品,然后GG和MM分別又加了幾份食品,有GG把訂單拿到前臺(tái)交給了服務(wù)員,服務(wù)員清算了一下所有花費(fèi),GG當(dāng)即暈倒_??磥?lái)一個(gè)月的生活費(fèi)是確實(shí)的泡湯了,不過(guò)還是故作振作,微笑著來(lái)到眾美女中,和眾美女坐在那里等著慢慢享用美食,而剩下的一切就交給服務(wù)員了簡(jiǎn)單工廠模式解釋?zhuān)?簡(jiǎn)單工廠模式(Simple Factory Pattern)屬于類(lèi)的創(chuàng)新型模式,又叫靜態(tài)工廠方法模式(Static FactoryMethod Pattern),是通過(guò)專(zhuān)門(mén)定義一個(gè)類(lèi)來(lái)負(fù)責(zé)創(chuàng)建其他類(lèi)的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)。簡(jiǎn)單工廠模式的UML圖: 簡(jiǎn)單工廠模式中包含的角色及其相應(yīng)的職責(zé)如下: 工廠角色(Creator):這是簡(jiǎn)單工廠模式的核心,由它負(fù)責(zé)創(chuàng)建所有的類(lèi)的內(nèi)部邏輯。當(dāng)然工廠類(lèi)必須能夠被外界調(diào)用,創(chuàng)建所需要的產(chǎn)品對(duì)象。 抽象(Product)產(chǎn)品角色:簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類(lèi),注意,這里的父類(lèi)可以是接口也可以是抽象類(lèi),它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。 具體產(chǎn)品(Concrete Product)角色:簡(jiǎn)單工廠所創(chuàng)建的具體實(shí)例對(duì)象,這些具體的產(chǎn)品往往都擁有共同的父類(lèi)。簡(jiǎn)單工廠模式深入分析: 簡(jiǎn)單工廠模式解決的問(wèn)題是如何去實(shí)例化一個(gè)合適的對(duì)象。 簡(jiǎn)單工廠模式的核心思想就是:有一個(gè)專(zhuān)門(mén)的類(lèi)來(lái)負(fù)責(zé)創(chuàng)建實(shí)例的過(guò)程。 具體來(lái)說(shuō),把產(chǎn)品看著是一系列的類(lèi)的集合,這些類(lèi)是由某個(gè)抽象類(lèi)或者接口派生出來(lái)的一個(gè)對(duì)象樹(shù)。而工廠類(lèi)用來(lái)產(chǎn)生一個(gè)合適的對(duì)象來(lái)滿(mǎn)足客戶(hù)的要求。 如果簡(jiǎn)單工廠模式所涉及到的具體產(chǎn)品之間沒(méi)有共同的邏輯,那么我們就可以使用接口來(lái)扮演抽象產(chǎn)品的角色;如果具體產(chǎn)品之間有功能的邏輯或,我們就必須把這些共同的東西提取出來(lái),放在一個(gè)抽象類(lèi)中,然后讓具體產(chǎn)品繼承抽象類(lèi)。為實(shí)現(xiàn)更好復(fù)用的目的,共同的東西總是應(yīng)該抽象出來(lái)的。 在實(shí)際的的使用中,抽閑產(chǎn)品和具體產(chǎn)品之間往往是多層次的產(chǎn)品結(jié)構(gòu),如下圖所示:簡(jiǎn)單工廠模式使用場(chǎng)景分析及代碼實(shí)現(xiàn): GG請(qǐng)自己的女朋友和眾多美女吃飯,但是GG自己是不會(huì)做飯的或者做的飯很不好,這說(shuō)明GG不用自己去創(chuàng)建各種食物的對(duì)象;各個(gè)美女都有各自的愛(ài)好,到麥當(dāng)勞后她們喜歡吃什么直接去點(diǎn)就行了,麥當(dāng)勞就是生產(chǎn)各種食物的工廠,這時(shí)候GG不用自己動(dòng)手,也可以請(qǐng)這么多美女吃飯,所要做的就是買(mǎi)單O(_)O哈哈,其UML圖如下所示: 實(shí)現(xiàn)代碼如下: 新建立一個(gè)食物的接口:packagecom.diermeng.designPattern.SimpleFactory;/* 產(chǎn)品的抽象接口*/publicinterfaceFood /* * 獲得相應(yīng)的食物 */publicvoidget();接下來(lái)建立具體的產(chǎn)品:麥香雞和薯?xiàng)lpackagecom.diermeng.designPattern.SimpleFactory.impl;importcom.diermeng.designPattern.SimpleFactory.Food;/* 麥香雞對(duì)抽象產(chǎn)品接口的實(shí)現(xiàn)*/publicclassMcChickenimplementsFood /* * 獲取一份麥香雞 */publicvoidget() System.out.println(我要一份麥香雞); packagecom.diermeng.designPattern.SimpleFactory.impl;importcom.diermeng.designPattern.SimpleFactory.Food;/* 薯?xiàng)l對(duì)抽象產(chǎn)品接口的實(shí)現(xiàn)*/publicclassChipsimplementsFood /* * 獲取一份薯?xiàng)l */publicvoidget() System.out.println(我要一份薯?xiàng)l); 現(xiàn)在建立一個(gè)食物加工工廠:packagecom.diermeng.designPattern.SimpleFactory.impl;importcom.diermeng.designPattern.SimpleFactory.Food;publicclassFoodFactory publicstaticFood getFood(String type)throwsInstantiationException, IllegalAccessException, ClassNotFoundException if(type.equalsIgnoreCase(mcchicken) returnMcChicken.class.newInstance(); elseif(type.equalsIgnoreCase(chips) returnChips.class.newInstance(); else System.out.println(哎呀!找不到相應(yīng)的實(shí)例化類(lèi)啦!); returnnull; 最后我們建立測(cè)試客戶(hù)端:packagecom.diermeng.designPattern.SimpleFactory.client;importcom.diermeng.designPattern.SimpleFactory.Food;importcom.diermeng.designPattern.SimpleFactory.impl.FoodFactory;/* 測(cè)試客戶(hù)端*/publicclassSimpleFactoryTest publicstaticvoidmain(String args)throwsInstantiationException, IllegalAccessException, ClassNotFoundException /實(shí)例化各種食物 Food mcChicken = FoodFactory.getFood(McChicken); Food chips = FoodFactory.getFood(Chips); Food eggs = FoodFactory.getFood(Eggs); /獲取食物 if(mcChicken!=null) mcChicken.get(); if(chips!=null) chips.get(); if(eggs!=null) eggs.get(); 輸出的結(jié)果如下:哎呀!找不到相應(yīng)的實(shí)例化類(lèi)啦!我要一份麥香雞我要一份薯?xiàng)l簡(jiǎn)單工廠模式的優(yōu)缺點(diǎn)分析: 優(yōu)點(diǎn):工廠類(lèi)是整個(gè)模式的關(guān)鍵所在。它包含必要的判斷邏輯,能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類(lèi)的對(duì)象。用戶(hù)在使用時(shí)可以直接根據(jù)工廠類(lèi)去創(chuàng)建所需的實(shí)例,而無(wú)需了解這些對(duì)象是如何創(chuàng)建以及如何組織的。有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。 缺點(diǎn):由于工廠類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯,這就直接導(dǎo)致一旦這個(gè)工廠出了問(wèn)題,所有的客戶(hù)端都會(huì)受到牽連;而且由于簡(jiǎn)單工廠模式的產(chǎn)品室基于一個(gè)共同的抽象類(lèi)或者接口,這樣一來(lái),但產(chǎn)品的種類(lèi)增加的時(shí)候,即有不同的產(chǎn)品接口或者抽象類(lèi)的時(shí)候,工廠類(lèi)就需要判斷何時(shí)創(chuàng)建何種種類(lèi)的產(chǎn)品,這就和創(chuàng)建何種種類(lèi)產(chǎn)品的產(chǎn)品相互混淆在了一起,違背了單一職責(zé),導(dǎo)致系統(tǒng)喪失靈活性和可維護(hù)性。而且更重要的是,簡(jiǎn)單工廠模式違背了“開(kāi)放封閉原則”,就是違背了“系統(tǒng)對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉”的原則,因?yàn)楫?dāng)我新增加一個(gè)產(chǎn)品的時(shí)候必須修改工廠類(lèi),相應(yīng)的工廠類(lèi)就需要重新編譯一遍。 總結(jié)一下:簡(jiǎn)單工廠模式分離產(chǎn)品的創(chuàng)建者和消費(fèi)者,有利于軟件系統(tǒng)結(jié)構(gòu)的優(yōu)化;但是由于一切邏輯都集中在一個(gè)工廠類(lèi)中,導(dǎo)致了沒(méi)有很高的內(nèi)聚性,同時(shí)也違背了“開(kāi)放封閉原則”。另外,簡(jiǎn)單工廠模式的方法一般都是靜態(tài)的,而靜態(tài)工廠方法是無(wú)法讓子類(lèi)繼承的,因此,簡(jiǎn)單工廠模式無(wú)法形成基于基類(lèi)的繼承樹(shù)結(jié)構(gòu)。簡(jiǎn)單工廠模式的實(shí)際應(yīng)用簡(jiǎn)介: 作為一個(gè)最基本和最簡(jiǎn)單的設(shè)計(jì)模式,簡(jiǎn)單工廠模式卻有很非常廣泛的應(yīng)用,我們這里以Java中的JDBC操作數(shù)據(jù)庫(kù)為例來(lái)說(shuō)明。 JDBC是SUN公司提供的一套數(shù)據(jù)庫(kù)編程接口API,它利用Java語(yǔ)言提供簡(jiǎn)單、一致的方式來(lái)訪問(wèn)各種關(guān)系型數(shù)據(jù)庫(kù)。Java程序通過(guò)JDBC可以執(zhí)行SQL語(yǔ)句,對(duì)獲取的數(shù)據(jù)進(jìn)行處理,并將變化了的數(shù)據(jù)存回?cái)?shù)據(jù)庫(kù),因此,JDBC是Java應(yīng)用程序與各種關(guān)系數(shù)據(jù)進(jìn)行對(duì)話(huà)的一種機(jī)制。用JDBC進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn)時(shí),要使用數(shù)據(jù)庫(kù)廠商提供的驅(qū)動(dòng)程序接口與數(shù)據(jù)庫(kù)管理系統(tǒng)進(jìn)行數(shù)據(jù)交互??蛻?hù)端要使用使用數(shù)據(jù)時(shí),只需要和工廠進(jìn)行交互即可,這就導(dǎo)致操作步驟得到極大的簡(jiǎn)化,操作步驟按照順序依次為:注冊(cè)并加載數(shù)據(jù)庫(kù)驅(qū)動(dòng),一般使用Class.forName();創(chuàng)建與數(shù)據(jù)庫(kù)的鏈接Connection對(duì)象;創(chuàng)建SQL語(yǔ)句對(duì)象preparedStatement(sql);提交SQL語(yǔ)句,根據(jù)實(shí)際情況使用executeQuery()或者executeUpdate();顯示相應(yīng)的結(jié)果;關(guān)閉數(shù)據(jù)庫(kù)。溫馨提示: 嚴(yán)格意義上講,簡(jiǎn)單工廠模式并不算是一種設(shè)計(jì)模式,簡(jiǎn)單工廠模式更像是一種編程習(xí)慣,而這被廣泛的應(yīng)用。但是因?yàn)楹?jiǎn)單工廠模式在“高內(nèi)聚”方面的欠缺,同時(shí)更致命的是違背了嚴(yán)格意義上的“開(kāi)放封閉原則”,或者說(shuō)只對(duì)“開(kāi)放封閉原則”提供某種程度上的支持,這就使得每次新增加一個(gè)產(chǎn)品的時(shí)候是

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論