![java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/b4ca1799-f2dc-47de-aaa8-5cdf0156cea2/b4ca1799-f2dc-47de-aaa8-5cdf0156cea21.gif)
![java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/b4ca1799-f2dc-47de-aaa8-5cdf0156cea2/b4ca1799-f2dc-47de-aaa8-5cdf0156cea22.gif)
![java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/b4ca1799-f2dc-47de-aaa8-5cdf0156cea2/b4ca1799-f2dc-47de-aaa8-5cdf0156cea23.gif)
![java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/b4ca1799-f2dc-47de-aaa8-5cdf0156cea2/b4ca1799-f2dc-47de-aaa8-5cdf0156cea24.gif)
![java設(shè)計(jì)模式-簡(jiǎn)單工廠模式_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-2/15/b4ca1799-f2dc-47de-aaa8-5cdf0156cea2/b4ca1799-f2dc-47de-aaa8-5cdf0156cea25.gif)
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 寫電子版合同范本
- 個(gè)人合資合同范本
- 修建魚塘工程合同范例
- 深化行業(yè)企業(yè)與產(chǎn)業(yè)園區(qū)合作的高效人才培養(yǎng)路徑
- 個(gè)人花園施工合同范本
- 農(nóng)業(yè)人工勞務(wù)合同范例
- 2025年度高新技術(shù)企業(yè)項(xiàng)目合同擔(dān)保范圍界定
- 全額退保合同范例
- 體育經(jīng)濟(jì)租賃合同范本
- 光伏屋頂安裝合同范本
- 新部編版小學(xué)六年級(jí)下冊(cè)語(yǔ)文第二單元測(cè)試卷及答案
- 5《這些事我來做》(說課稿)-部編版道德與法治四年級(jí)上冊(cè)
- 2025年福建福州市倉(cāng)山區(qū)國(guó)有投資發(fā)展集團(tuán)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 2025年人教版新教材數(shù)學(xué)一年級(jí)下冊(cè)教學(xué)計(jì)劃(含進(jìn)度表)
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 2025長(zhǎng)江航道工程局招聘101人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年國(guó)新國(guó)際投資有限公司招聘筆試參考題庫(kù)含答案解析
- 2025年八省聯(lián)考四川高考生物試卷真題答案詳解(精校打印)
- 《供電營(yíng)業(yè)規(guī)則》
- 企業(yè)員工退休管理規(guī)章制度(3篇)
- 執(zhí)行總經(jīng)理崗位職責(zé)
評(píng)論
0/150
提交評(píng)論