java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第1頁(yè)
java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第2頁(yè)
java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第3頁(yè)
java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第4頁(yè)
java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、NET設(shè)計(jì)模式(1): 簡(jiǎn)單工廠模式 最近一直在看設(shè)計(jì)模式,想把自己的學(xué)習(xí)筆記與大家分享一下,如果能幫助大家的話,我會(huì)非常高興,同時(shí)也歡迎大家指出里面的不足。園子里其實(shí)關(guān)于此類文章已經(jīng)很多了,如果dudu感覺放在首頁(yè)欠妥的話,可以調(diào)一下。簡(jiǎn)單工廠模式(Simple Factory Pattern)介紹:簡(jiǎn)單工廠模式不能說是一個(gè)設(shè)計(jì)模式,說它是一種編程習(xí)慣可能更恰當(dāng)些。因?yàn)樗辽俨皇荊of23種設(shè)計(jì)模式之一。但它在實(shí)際的編程中經(jīng)常被用到,而且思想也非常簡(jiǎn)單,可以說是工廠方法模式的一個(gè)引導(dǎo),所以我想有必要把它作為第一個(gè)講一下。引入:我們?cè)诰幊痰臅r(shí)候,每當(dāng)"new"一個(gè)對(duì)象之后,

2、這個(gè)對(duì)象就依賴于這個(gè)類了。如果在后期的維護(hù)過程中由于某些原因需要修改一下這個(gè)類,則唯一的做法就是打開源代碼,進(jìn)行修改,修改所有與這個(gè)對(duì)象有關(guān)的操作。這對(duì)我們是非常不利的。問題出來了:對(duì)象不能應(yīng)對(duì)“具體實(shí)例化類型”的變化解決思路:套用一下李建忠李老師的話,封裝變化點(diǎn),哪里變化,封裝哪里。在這個(gè)例子中,要實(shí)例化的類變了,就將實(shí)例化這個(gè)操作封裝起來,我們可以把"new"這個(gè)操作移交一個(gè)具體的類,由它去負(fù)責(zé)根據(jù)我們的條件創(chuàng)建具體類的實(shí)例,也就是下面要說的“簡(jiǎn)單工廠模式”。定義:專門定義一個(gè)類來負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類或接口。簡(jiǎn)單工廠模式又稱為靜態(tài)工廠方

3、法(Static Factory Method)模式,屬于類的創(chuàng)建型模式,通常根據(jù)一個(gè)條件(參數(shù))來返回不同的類的實(shí)例。意圖:提供一個(gè)類,由它負(fù)責(zé)根據(jù)一定的條件創(chuàng)建某一具體類的實(shí)例參與者: · 工廠角色(Creator)是簡(jiǎn)單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有具體產(chǎn)品類的實(shí)例。工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象。 · 抽象產(chǎn)品角色(Product)是所有具體產(chǎn)品角色的父類,它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。 · 具體產(chǎn)品角色(Concrete Product)繼承自抽象產(chǎn)品角色,一般為多個(gè),是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo)。工廠類返回的都是該角色的某一具體產(chǎn)品

4、。 UML圖:現(xiàn)實(shí)生活中例子:每次參加不同的聚會(huì)或者與不同的人見面,可能穿的衣服是不一樣的,比如,你今天上午要與你的一個(gè)新客戶見面,你可能會(huì)對(duì)你的老婆說:老婆,給拿件商務(wù)裝(參數(shù)),我要去見我的一個(gè)客戶,你老婆(工廠類)接到你的請(qǐng)求(商務(wù)裝參數(shù))后,從衣柜中取出一件商務(wù)裝(具體產(chǎn)品),交給你。整個(gè)過程就完成了。分析:你可能根據(jù)不同的條件,要的衣服是不一樣的,但要的衣服都是已經(jīng)在你的衣柜中存在的。并且,每件上衣它們都屬于同一種抽象,即它們可以從一個(gè)抽象類或接口中繼承,這此衣服各自都有一定特征,這些都是條件。然后你要的時(shí)候,就可以向你老婆說一種特征,她就會(huì)根據(jù)這個(gè)特征為你服務(wù)了。這就是典型的簡(jiǎn)單工

5、廠模式的應(yīng)用。 抽象產(chǎn)品類代碼1    /*/ <summary>2    / 抽象產(chǎn)品類:上衣3    / </summary>4    public interface ICoat5    6        void Ge

6、tYourCoat();7      非常簡(jiǎn)單,是吧?這里我只是舉一個(gè)僅僅能說明問題的例子,在具體的項(xiàng)目中,可能是很復(fù)雜的哦。具體產(chǎn)品類代碼 1namespace SimpleFactory 2 3    /*/ <summary> 4    / 具體產(chǎn)品類:商務(wù)上衣 5    / </summary> 

7、6    public class BusinessCoat:ICoat 7     8        public void GetYourCoat() 9        10         &#

8、160;  Console.WriteLine("商務(wù)上衣");11        12    1314    /*/ <summary>15    / 具體產(chǎn)品類:時(shí)尚上衣16    / </summary>17    pu

9、blic class FashionCoat : ICoat18    19        /*/ <summary>20        / 實(shí)現(xiàn)ICoat中定義的方法21        / </summary>22 

10、;       / <returns></returns>23        public void GetYourCoat()24        25            Console.Wr

11、iteLine("時(shí)尚上衣");26        27    28簡(jiǎn)單工廠模式中最核心的部分:工廠類 1namespace SimpleFactory 2 3    /*/ <summary> 4    / 簡(jiǎn)單工廠模式中的核心部分:工廠類 5   

12、60;/ </summary> 6    public class Factory 7     8        public ICoat CreateCoat(string styleName) 9        10  &#

13、160;         switch (styleName.Trim().ToLower()11            12                case "business":

14、13                    return new BusinessCoat();14                case "fashion":15  

15、                  return new FashionCoat();16                default :17       &

16、#160;            throw new Exception("還沒有你要的那種衣服");18            19        20    21再看一下客戶在調(diào)用的時(shí)候的代碼&#

17、160;1 /*/ <summary> 2    / 客戶類 3    / </summary> 4    class Client 5     6        static void Main(string

18、60;args) 7         8            ICoat food; 9            try10         

19、0;  11                Factory factory = new Factory();1213                Console.Write("我要的是時(shí)尚上衣t")

20、;14                food = factory.CreateCoat("fashion");15                food.GetYourCoat();1617    

21、;        18            catch (Exception ex)19            20            

22、;    Console.WriteLine(ex.Message);21            22        23    到這里,代碼就完成了。在客戶端的代碼中有我們就可以根據(jù)具體的參數(shù),返回我們希望返回的對(duì)象,將"new"操作推遲到工廠類中實(shí)現(xiàn)。這里,參數(shù)我直接寫上了,我們其實(shí)可以將這個(gè)參

23、數(shù)寫到一個(gè)xml文件中,如app.config文件中,動(dòng)態(tài)的讀出來,需要穿另外一種衣服了,只需要打開app.config文件,修改里面的值就行了,不需要項(xiàng)目重新編譯。這樣這個(gè)小程序就能夠適應(yīng)一定的變化了(在上傳上去的代碼中我會(huì)修改一下)。其實(shí)它也是設(shè)計(jì)模式正要解決的問題,在不修改代碼的情況下,使項(xiàng)目能夠適應(yīng)一定的客戶需求變化。注意,是一定的,并非全部。優(yōu)點(diǎn):· 簡(jiǎn)單工廠模式能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類的對(duì)象。通過它,外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)  象的尷尬局面中擺脫出來。 · 外界與具體類隔離開來,偶合性低。 · 明確區(qū)分了各自的職

24、責(zé)和權(quán)力,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。 缺點(diǎn):· 工廠類集中了所有實(shí)例的創(chuàng)建邏輯,容易違反GRASPR的高內(nèi)聚的責(zé)任分配原則  · 雖然簡(jiǎn)單工廠模式能夠適應(yīng)一定的變化,但是它所能解決的問題是遠(yuǎn)遠(yuǎn)有限的。它所能創(chuàng)建的類只能是事先教考慮到的,如果需要添加新的類,則就需要改變工廠類了。(這個(gè)問題在下一個(gè)工廠方法模式將得到很好的解決) 應(yīng)用情景· 工廠類負(fù)責(zé)創(chuàng)建的對(duì)象比較少  · 客戶只知道傳入了工廠類的參數(shù),對(duì)于始何創(chuàng)建對(duì)象(邏輯)不關(guān)心  參考資料 · 深入淺出設(shè)計(jì)模式(C#/Java版)  清華大學(xué)出版社

25、  · MSDN Webcast  C#面向?qū)ο笤O(shè)計(jì)模式縱橫談 李建忠老師 源程序下載:/Files/anlyren/SimpleFactory.rarBY-fangang在上一章(原創(chuàng))一個(gè)優(yōu)秀軟件開發(fā)人員的必修課:GRASP(2)低耦合中我聊了聊低耦合,今天我想再聊聊與低耦合休戚相關(guān)、GRASP的另一個(gè)重要的模式:高內(nèi)聚。2.高內(nèi)聚(High Cohesion)高內(nèi)聚是另一個(gè)普遍用來評(píng)判軟件設(shè)計(jì)質(zhì)量的標(biāo)準(zhǔn)。內(nèi)聚,更為專業(yè)的說法叫功能內(nèi)聚,是對(duì)軟件系統(tǒng)中元素職責(zé)相關(guān)性和集中度的度量。如果元素具有高度相關(guān)的職責(zé),除了這些職責(zé)內(nèi)的任務(wù),沒有其它過多的工作,那么該元素

26、就具有高內(nèi)聚性,反之則為低內(nèi)聚性。高內(nèi)聚要求軟件系統(tǒng)中的各個(gè)元素具有較高的協(xié)作性,因?yàn)樵谖覀冊(cè)谕瓿绍浖枨笾械囊粋€(gè)功能,可能需要做各種事情,但是具有高內(nèi)聚性的一個(gè)元素,只完成它職責(zé)內(nèi)的事情,而把那些不在它職責(zé)內(nèi)的事情拿去請(qǐng)求別人來完成。這就好像,如果我是一個(gè)項(xiàng)目經(jīng)理,我的職責(zé)是監(jiān)控和協(xié)調(diào)我的項(xiàng)目各個(gè)階段的工作。當(dāng)我的項(xiàng)目進(jìn)入需求分析階段,我會(huì)請(qǐng)求需求分析員來完成;當(dāng)我的項(xiàng)目進(jìn)入開發(fā)階段,我會(huì)請(qǐng)求軟件開發(fā)人員來完成;當(dāng)我的項(xiàng)目需要測(cè)試的時(shí)候,我會(huì)請(qǐng)求測(cè)試人員。如果我參與了開發(fā),我就不是一個(gè)高內(nèi)聚的元素,因?yàn)殚_發(fā)不是我的職責(zé)。我們的項(xiàng)目為什么要高內(nèi)聚呢?我覺得可以從可讀性、復(fù)用性、可維護(hù)性和易變更

27、性四個(gè)方面來理解。1可讀性一個(gè)人寫文章、講事情,條理清晰才能易于理解,這同樣發(fā)生在讀寫軟件代碼上。如果一堆代碼寫得一團(tuán)亂麻,東一個(gè)跳轉(zhuǎn)西一個(gè)調(diào)用,讀它的人會(huì)感覺非常頭疼。這種事情也許一直在寫程序的你我都曾經(jīng)有過經(jīng)歷。如果一段程序條理非常清晰,每個(gè)類通過名稱或說明都能清楚明白它的意義,類的每個(gè)屬性、函數(shù)也都是易于理解的它所應(yīng)當(dāng)完成的任務(wù)和行為,這段程序的可讀性必然提高。在軟件產(chǎn)業(yè)越來越密集,軟件產(chǎn)業(yè)中開發(fā)人員協(xié)作越來越緊密、分工越來越細(xì)的今天,軟件可讀性的要求相信也越來越為人們所重視。2復(fù)用性在軟件開發(fā)中,最低等級(jí)的復(fù)用是代碼拷貝,然后是函數(shù)的復(fù)用、對(duì)象的復(fù)用、組件的復(fù)用。軟件開發(fā)中最懶的人是最

28、聰明的人,他們總是想到復(fù)用。在代碼編寫的時(shí)候突然發(fā)現(xiàn)某個(gè)功能是曾經(jīng)實(shí)現(xiàn)過的功能,直接把它拷貝過來就ok了。如果這段代碼在同一個(gè)對(duì)象中,那么就提出來寫一個(gè)函數(shù)到處調(diào)用就行了。如果不是在同一個(gè)對(duì)象中呢,就將其抽象成一個(gè)對(duì)象到處調(diào)用吧。如果不在一個(gè)項(xiàng)目中呢,那就做成組件給各個(gè)項(xiàng)目引用吧。代碼復(fù)用也使我們的代碼在復(fù)用的過程中不斷精化、不斷健壯、提高代碼質(zhì)量。代碼的復(fù)用的確給我們的開發(fā)帶來了不少便利,但是一段代碼能否在各個(gè)需要的地方都能復(fù)用呢?這給我們的軟件開發(fā)質(zhì)量提出了新的要求:好的代碼可以復(fù)用,不好的則不行。軟件中的一個(gè)對(duì)象如果能保證能完成自己職能范圍內(nèi)的各項(xiàng)任務(wù),同時(shí)又不去理會(huì)與自己職能無關(guān)的其它

29、任務(wù),那么它就能夠保證功能的相對(duì)獨(dú)立性,也就可以脫離自己所處的環(huán)境而復(fù)用到其它環(huán)境中,這是一個(gè)具有內(nèi)聚性的對(duì)象。3可維護(hù)性和易變更性在前面如何在struts+spring+hibernate的框架下構(gòu)建低耦合高內(nèi)聚的軟件中我提到,我們現(xiàn)在的軟件是在不斷變更的,這種變更不僅來自于我們的客戶,更來自于我們的市場(chǎng)。如果我們的軟件通過變更能及時(shí)適應(yīng)我們的市場(chǎng)需求,我們就可以在市場(chǎng)競(jìng)爭(zhēng)中獲勝。如何能及時(shí)變更以適應(yīng)我們的市場(chǎng)呢,就是通過調(diào)整軟件的結(jié)構(gòu),使我們每次的變更付出的代價(jià)最小,耗費(fèi)的人力最小,這種變更才最快最經(jīng)濟(jì)。高內(nèi)聚的軟件,每個(gè)系統(tǒng)、模塊、類的任務(wù)都高度相關(guān),就使每一次的變更涉及的范圍縮小到最小。比如評(píng)審表發(fā)生了變更,只會(huì)與評(píng)審表對(duì)象有關(guān),我們不會(huì)去更改其它的對(duì)象。如果我們能做到這一點(diǎn),我們的系統(tǒng)當(dāng)然是可維護(hù)性好、易變更性好的系統(tǒng)。 那么,我們?nèi)绾巫龅礁邇?nèi)聚呢?就拿前面我提到的評(píng)審項(xiàng)目舉例。我現(xiàn)在要為“評(píng)審表”對(duì)象編寫一段填寫并保存評(píng)審表的代碼。評(píng)審表對(duì)象的職責(zé)是更新和查詢?cè)u(píng)審表的數(shù)據(jù),但是在顯示一個(gè)要填寫的評(píng)審表的時(shí)候,我需要顯示

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論