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)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(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)于此類(lèi)文章已經(jīng)很多了,如果dudu感覺(jué)放在首頁(yè)欠妥的話,可以調(diào)一下。簡(jiǎn)單工廠模式(Simple Factory Pattern)介紹:簡(jiǎn)單工廠模式不能說(shuō)是一個(gè)設(shè)計(jì)模式,說(shuō)它是一種編程習(xí)慣可能更恰當(dāng)些。因?yàn)樗辽俨皇荊of23種設(shè)計(jì)模式之一。但它在實(shí)際的編程中經(jīng)常被用到,而且思想也非常簡(jiǎn)單,可以說(shuō)是工廠方法模式的一個(gè)引導(dǎo),所以我想有必要把它作為第一個(gè)講一下。引入:我們?cè)诰幊痰臅r(shí)候,每當(dāng)"new"一個(gè)對(duì)象之后,

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

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

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

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

6、tYourCoat();7      非常簡(jiǎn)單,是吧?這里我只是舉一個(gè)僅僅能說(shuō)明問(wèn)題的例子,在具體的項(xiàng)目中,可能是很復(fù)雜的哦。具體產(chǎn)品類(lèi)代碼 1namespace SimpleFactory 2 3    /*/ <summary> 4    / 具體產(chǎn)品類(lèi):商務(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)品類(lèi):時(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)單工廠模式中最核心的部分:工廠類(lèi) 1namespace SimpleFactory 2 3    /*/ <summary> 4    / 簡(jiǎn)單工廠模式中的核心部分:工廠類(lèi) 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("還沒(méi)有你要的那種衣服");18            19        20    21再看一下客戶(hù)在調(diào)用的時(shí)候的代碼&#

17、160;1 /*/ <summary> 2    / 客戶(hù)類(lèi) 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    到這里,代碼就完成了。在客戶(hù)端的代碼中有我們就可以根據(jù)具體的參數(shù),返回我們希望返回的對(duì)象,將"new"操作推遲到工廠類(lèi)中實(shí)現(xiàn)。這里,參數(shù)我直接寫(xiě)上了,我們其實(shí)可以將這個(gè)參

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

24、責(zé)和權(quán)力,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。 缺點(diǎn):· 工廠類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯,容易違反GRASPR的高內(nèi)聚的責(zé)任分配原則  · 雖然簡(jiǎn)單工廠模式能夠適應(yīng)一定的變化,但是它所能解決的問(wèn)題是遠(yuǎn)遠(yuǎn)有限的。它所能創(chuàng)建的類(lèi)只能是事先教考慮到的,如果需要添加新的類(lèi),則就需要改變工廠類(lèi)了。(這個(gè)問(wèn)題在下一個(gè)工廠方法模式將得到很好的解決) 應(yīng)用情景· 工廠類(lèi)負(fù)責(zé)創(chuàng)建的對(duì)象比較少  · 客戶(hù)只知道傳入了工廠類(lèi)的參數(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)秀軟件開(kāi)發(fā)人員的必修課:GRASP(2)低耦合中我聊了聊低耦合,今天我想再聊聊與低耦合休戚相關(guān)、GRASP的另一個(gè)重要的模式:高內(nèi)聚。2.高內(nèi)聚(High Cohesion)高內(nèi)聚是另一個(gè)普遍用來(lái)評(píng)判軟件設(shè)計(jì)質(zhì)量的標(biāo)準(zhǔn)。內(nèi)聚,更為專(zhuān)業(yè)的說(shuō)法叫功能內(nèi)聚,是對(duì)軟件系統(tǒng)中元素職責(zé)相關(guān)性和集中度的度量。如果元素具有高度相關(guān)的職責(zé),除了這些職責(zé)內(nèi)的任務(wù),沒(méi)有其它過(guò)多的工作,那么該元素

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)求別人來(lái)完成。這就好像,如果我是一個(gè)項(xiàng)目經(jīng)理,我的職責(zé)是監(jiān)控和協(xié)調(diào)我的項(xiàng)目各個(gè)階段的工作。當(dāng)我的項(xiàng)目進(jìn)入需求分析階段,我會(huì)請(qǐng)求需求分析員來(lái)完成;當(dāng)我的項(xiàng)目進(jìn)入開(kāi)發(fā)階段,我會(huì)請(qǐng)求軟件開(kāi)發(fā)人員來(lái)完成;當(dāng)我的項(xiàng)目需要測(cè)試的時(shí)候,我會(huì)請(qǐng)求測(cè)試人員。如果我參與了開(kāi)發(fā),我就不是一個(gè)高內(nèi)聚的元素,因?yàn)殚_(kāi)發(fā)不是我的職責(zé)。我們的項(xiàng)目為什么要高內(nèi)聚呢?我覺(jué)得可以從可讀性、復(fù)用性、可維護(hù)性和易變更

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

28、聰明的人,他們總是想到復(fù)用。在代碼編寫(xiě)的時(shí)候突然發(fā)現(xiàn)某個(gè)功能是曾經(jīng)實(shí)現(xiàn)過(guò)的功能,直接把它拷貝過(guò)來(lái)就ok了。如果這段代碼在同一個(gè)對(duì)象中,那么就提出來(lái)寫(xiě)一個(gè)函數(shù)到處調(diào)用就行了。如果不是在同一個(gè)對(duì)象中呢,就將其抽象成一個(gè)對(duì)象到處調(diào)用吧。如果不在一個(gè)項(xiàng)目中呢,那就做成組件給各個(gè)項(xiàng)目引用吧。代碼復(fù)用也使我們的代碼在復(fù)用的過(guò)程中不斷精化、不斷健壯、提高代碼質(zhì)量。代碼的復(fù)用的確給我們的開(kāi)發(fā)帶來(lái)了不少便利,但是一段代碼能否在各個(gè)需要的地方都能復(fù)用呢?這給我們的軟件開(kāi)發(fā)質(zhì)量提出了新的要求:好的代碼可以復(fù)用,不好的則不行。軟件中的一個(gè)對(duì)象如果能保證能完成自己職能范圍內(nèi)的各項(xiàng)任務(wù),同時(shí)又不去理會(huì)與自己職能無(wú)關(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)在的軟件是在不斷變更的,這種變更不僅來(lái)自于我們的客戶(hù),更來(lái)自于我們的市場(chǎng)。如果我們的軟件通過(guò)變更能及時(shí)適應(yīng)我們的市場(chǎng)需求,我們就可以在市場(chǎng)競(jìng)爭(zhēng)中獲勝。如何能及時(shí)變更以適應(yīng)我們的市場(chǎng)呢,就是通過(guò)調(diào)整軟件的結(jié)構(gòu),使我們每次的變更付出的代價(jià)最小,耗費(fèi)的人力最小,這種變更才最快最經(jīng)濟(jì)。高內(nèi)聚的軟件,每個(gè)系統(tǒng)、模塊、類(lèi)的任務(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ì)象編寫(xiě)一段填寫(xiě)并保存評(píng)審表的代碼。評(píng)審表對(duì)象的職責(zé)是更新和查詢(xún)?cè)u(píng)審表的數(shù)據(jù),但是在顯示一個(gè)要填寫(xiě)的評(píng)審表的時(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)論