版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
模式:
模式,即Pattern。其實(shí)就是解決某一類問(wèn)題的方法論。把解決某類問(wèn)題的方法總結(jié)歸納到理論高度,那就是模式。Alexander給出的經(jīng)典定義是:每個(gè)模式都描述了一個(gè)在我們的環(huán)境中不斷出現(xiàn)的問(wèn)題,然后描述了該問(wèn)題的解決方案的核心。通過(guò)這種方式,你可以無(wú)數(shù)次地使用那些已有的解決方案,無(wú)需再重復(fù)相同的工作。模式有不同的領(lǐng)域,建筑領(lǐng)域有建筑模式,軟件設(shè)計(jì)領(lǐng)域也有設(shè)計(jì)模式。當(dāng)一個(gè)領(lǐng)域逐漸成熟的時(shí)候,自然會(huì)出現(xiàn)很多模式。設(shè)計(jì)模式和面向?qū)ο蟮脑O(shè)計(jì)模式:
設(shè)計(jì)模式(Designpattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設(shè)計(jì)模式最初來(lái)源于建筑學(xué)。GOF(“四人幫”,指Gamma,Helm,Johnson&Vlissides,Addison-Wesley四人)的《設(shè)計(jì)模式》(1995年出版)是第一次將設(shè)計(jì)模式提升到理論高度,并將之規(guī)范化,本系列文章主要就是講解這23種經(jīng)典的設(shè)計(jì)模式。
面向?qū)ο笤O(shè)計(jì)的模式,顧名思義,就是在面向?qū)ο蠓治雠c設(shè)計(jì)中使用的設(shè)計(jì)模式,GOF23種設(shè)計(jì)模式同時(shí)也是面向?qū)ο蟮脑O(shè)計(jì)模式,本文不做區(qū)分。良好的設(shè)計(jì)模式運(yùn)用可以實(shí)現(xiàn)軟件設(shè)計(jì)的“高內(nèi)聚、低耦合”,提高軟件的復(fù)用性和可擴(kuò)展性??蚣?
框架,即Framework。其實(shí)就是某種應(yīng)用的半成品,就是一組組件,供你選用完成你自己的系統(tǒng)。簡(jiǎn)單說(shuō)就是使用別人搭好的舞臺(tái),你來(lái)做表演。而且,框架一般是成熟的,不斷升級(jí)的軟件。框架一般處在低層應(yīng)用平臺(tái)(如J2EE)和高層業(yè)務(wù)邏輯之間的中間層。架構(gòu):
架構(gòu)(Architecture)是一系列相關(guān)的抽象模式,用于指導(dǎo)大型軟件系統(tǒng)各個(gè)方面的設(shè)計(jì)。架構(gòu)是一個(gè)系統(tǒng)的草圖。架構(gòu)描述的對(duì)象是直接構(gòu)成系統(tǒng)的抽象組件。各個(gè)組件之間的連接則明確和相對(duì)細(xì)致地描述組件之間的通訊。在實(shí)現(xiàn)階段,這些抽象組件被細(xì)化為實(shí)際的組件,比如具體某個(gè)類或者對(duì)象。在面向?qū)ο箢I(lǐng)域中,組件之間的連接通常用接口來(lái)實(shí)現(xiàn)。
一些剛?cè)腴T的程序員經(jīng)常會(huì)混淆“框架”和“架構(gòu)”這兩個(gè)名詞,這里做了一下解釋。我們?yōu)槭裁匆褂迷O(shè)計(jì)模式呢?有人可能會(huì)說(shuō)為了設(shè)計(jì)出"高內(nèi)聚低耦合"的軟件。"高內(nèi)聚低耦合"的軟件實(shí)際上也就是本文所說(shuō)的具有可維護(hù)性和可復(fù)用性的軟件。這篇文章主要講解兩方面內(nèi)容,這兩方面是軟件設(shè)計(jì)中很重要,也是很關(guān)鍵的內(nèi)容,希望大家認(rèn)真思考并深刻理解。第一部分就是關(guān)于軟件的可維護(hù)性和可復(fù)用性的相關(guān)內(nèi)容,第二部分就是在第一部分的基礎(chǔ)上逐條講解面向?qū)ο筌浖O(shè)計(jì)的基本原則,本文內(nèi)容都是些很理論性的東西,這些理論是軟件設(shè)計(jì)的基礎(chǔ)。凡是有理論的地方,就有如何恰當(dāng)?shù)膶⒗碚搼?yīng)用到實(shí)踐中去的問(wèn)題,設(shè)計(jì)模式是對(duì)于學(xué)習(xí)OO設(shè)計(jì)原則的具體指導(dǎo),也就是說(shuō)設(shè)計(jì)模式就是將這些理論應(yīng)用到實(shí)踐的一種成熟的方式。軟件的可維護(hù)性和可復(fù)用性疊爽誕
首摟先來(lái)屑上一渾段大信師所底說(shuō)的竭話,鑒很經(jīng)赤典。她“通桿常認(rèn)終為,銅一個(gè)埋易于朵維護(hù)秀的系葡統(tǒng),骨就是介復(fù)用北率較盾高的虎系統(tǒng)麗;而銷一個(gè)董復(fù)用請(qǐng)率較略高的鏈系統(tǒng)蜜,就幼是一韻個(gè)易遲于維識(shí)護(hù)的啞系統(tǒng)除。但符是實(shí)熊際上巷,可港維護(hù)范性和沫可復(fù)蟲用性偽是兩胡個(gè)獨(dú)狼立的敘目標(biāo)波,就認(rèn)像兩傲只奔喪跑的遇兔子霧一樣氧,并珍不總滴是方坦向一菊致的夜。對(duì)屬于面歷向?qū)χ┫蟮某窜浖鞠到y(tǒng)棵設(shè)計(jì)流來(lái)說(shuō)想,在滴支持圾可維脂護(hù)性穗(M斃ai撿nt國(guó)ai浮na急bi擋li懇ty膜)的戲同時(shí)息,提菊高系狼統(tǒng)的進(jìn)可復(fù)撈用性濱(R屋eu伙se束ab監(jiān)il妄it睜y)惱是一支個(gè)核興心的蹈問(wèn)題遭。”速--灣《J受av濕a與機(jī)模式頭》閻基宏博扎士鏡荒京孫軟件礎(chǔ)系統(tǒng)籍的可咽維護(hù)候性:序還言
軟常件維惑護(hù)就組是軟搭件的銜再瑞生。阿一個(gè)談好的愉軟件銳設(shè)計(jì)壁,必沫須能懸夠允艘許新扭的設(shè)任計(jì)要藍(lán)求以包比較獄容易盜和平歉穩(wěn)的氣方式校加入伯到已賢有的乳系統(tǒng)鴉中去矛,從銹而使咸這個(gè)修系統(tǒng)營(yíng)能夠節(jié)不斷榆的的騎煥發(fā)辯出活語(yǔ)力。接一個(gè)劇可維態(tài)護(hù)性泛較好撥的系站統(tǒng),稀應(yīng)當(dāng)抓允許然維護(hù)臉工作婆能夠斬以容凡易、廢準(zhǔn)確繼、安蹄全和紗經(jīng)濟(jì)邁的形耐式進(jìn)塔行。?!緦?dǎo)碼致可冷維護(hù)杜性較買低的熄原因產(chǎn)】坑1、輝過(guò)于似僵硬缺:在桑系統(tǒng)膜中加丸入一饅個(gè)新姓的功龍能,籌不管著大小嶄都很最難,蝴不僅泛意味繭著建束造一暗個(gè)獨(dú)鉗立的而新的嘴模塊編,而臭且因妄為這后個(gè)新分功能薄會(huì)波紅及很朱多其污他模傾塊,伏最后罪成跨顫越幾觸個(gè)模獄塊的紹改動(dòng)處。丟2、壽過(guò)于匙脆弱軋:與叨軟件減的過(guò)刪于僵哄硬同匪時(shí)存果在,過(guò)是軟促件系陡統(tǒng)在程修改胞已有踏代碼貢時(shí)過(guò)掏于脆桑弱。僅對(duì)一期個(gè)地史方的孝修改槳,往盾往會(huì)件導(dǎo)致值看上廣去沒米有什帖么奉關(guān)系誠(chéng)的另橫外一逼個(gè)地培方發(fā)對(duì)生故們障。安3、洽復(fù)用層率低把:所蜜謂復(fù)臣用,講就是愧指一燙個(gè)軟妻件的豆組成肌部分末,可易以在巡同一膜個(gè)項(xiàng)念目的簽不同富地方拆甚至暑另一徹個(gè)項(xiàng)倍目中比重復(fù)修使用怪。復(fù)副用率祖低,潛指當(dāng)喬一段煤代碼分,函捧數(shù),王模塊捐的功腹能可賄以在姑新的宵模塊蜘或新宣的系始統(tǒng)使博用,棒但是燭已有獅代碼曬依賴允于其幕他很肺多東寫西,教很難麻分開噴。遼4、琴黏度降過(guò)高辟:一消個(gè)改哨動(dòng)可為以保湊存原坐始設(shè)降計(jì)意朽圖和籌原始捷設(shè)計(jì)請(qǐng)框架衫的方巧式進(jìn)青行,牲也可趕以以捐破壞絲原始辟意圖匹和框公架進(jìn)漂行?;氐谝灰卜N方寇法對(duì)況系統(tǒng)豆的未框來(lái)有五利,豪第二岸種辦教法是覆權(quán)宜蹤之計(jì)顆,可酸以解桿決短貸期的害問(wèn)題杯,但遺是會(huì)善犧牲索中長(zhǎng)宴期的債利益筑。如死果一健個(gè)系著統(tǒng)中唯使用扇第二休種方喇法比敢使用乳第一痛種方捏法容濕易,眉那么狗就是恩黏度劫過(guò)高踩。販【諷設(shè)計(jì)到的目北標(biāo)】殼1、坡可擴(kuò)嶼展性館:新奸的性餅?zāi)芸扇鲆院軍嗜菀坐f地加誤入到嘉系統(tǒng)劑中去卵,就蝶是可煮擴(kuò)展替性。舞這就典是系楚統(tǒng)“跨過(guò)于覆僵硬柴”的刺屬性獄的方頃面。齊2、海靈活瘡性:焦可以炒允許居代碼消修改俯平穩(wěn)帳地發(fā)欄生,鮮而不疊會(huì)波開及到鵲很多蜜其他拿的模篩塊,遞這就怖是靈呢活性披。靈慌活性斯其實(shí)烤就是炕“過(guò)島于脆撿弱”岸的屬討性的督方面排。每3、尺可插宿入性尺:可柄以很捉容易卸地將母一個(gè)靠類抽角出去悉,同遼時(shí)將麻另外誕一個(gè)兆有同如樣接瘦口的塊類加激入進(jìn)想來(lái),庫(kù)這就曬是可振插入主性。兩其實(shí)永,這白就是勁“黏姿度過(guò)采高”穩(wěn)的方態(tài)面??紭阈hb軟件年系統(tǒng)蛇的可賤復(fù)用倚性:方【軟可件復(fù)編用的辨好處悔】之1、巖較高筍的生辨產(chǎn)效夾率;捆2、劣較高旗的軟照件質(zhì)剪量;志3、雕恰當(dāng)泉使用伏復(fù)用劣可以樂改善儉系統(tǒng)旦的可驚維護(hù)舒性。紀(jì)【朱傳統(tǒng)魚的復(fù)側(cè)用形侄式】衰1、聾代碼奏的剪迅貼復(fù)填用;怕2、畏算法勸的復(fù)誠(chéng)用;筆3、游數(shù)據(jù)部結(jié)構(gòu)交的復(fù)火用。毅【面你向?qū)ζO笤O(shè)停計(jì)的合復(fù)用小】設(shè)在面語(yǔ)向?qū)Τ钕笳Z(yǔ)廈言中糖,數(shù)它據(jù)的慣抽象妹化,筐繼承姓,封花裝和賺多態(tài)釣性使著得一杏個(gè)系銅統(tǒng)可不以在壇更高西層次采上提盲供可冷復(fù)用冰性。則數(shù)據(jù)憐的抽遣象化沃和繼柄承關(guān)系系使計(jì)得概消念和幣定義逐可以淺復(fù)用勉;多溫態(tài)性淺使得痕實(shí)現(xiàn)視和應(yīng)損用得火到復(fù)精用;填而抽生象化商和封幼裝可鼻以保污持和芝促進(jìn)康系統(tǒng)消的可強(qiáng)維護(hù)國(guó)性,糖復(fù)用冷的重堂點(diǎn)轉(zhuǎn)征移到快含有音宏觀刻商業(yè)捧邏輯銷的抽幟象層扇次上將。在僻面向幣對(duì)象啟的設(shè)穩(wěn)計(jì)里鳴面,按可維理護(hù)性心復(fù)用鐘是以嶺設(shè)計(jì)球原則壁和設(shè)怒計(jì)模趙式為旗基礎(chǔ)狀的。墻格晨
提風(fēng)高系源統(tǒng)可懇維護(hù)柱性和柴可復(fù)諷用性奉的設(shè)股計(jì)原暗則余1、途“開塑-閉決”原瞇則(登Op縣en聲-C箏l冤os氣ed喜P晃ri菊nc晚ip麥le擋,或懇者O渾CP捉);現(xiàn)一個(gè)寒軟件絡(luò)實(shí)體針應(yīng)該艱對(duì)擴(kuò)刃展開集放,瓣對(duì)修差改關(guān)四閉狼;裁在設(shè)梳計(jì)一降個(gè)模毀塊的許時(shí)候帽,應(yīng)是當(dāng)使肯這個(gè)紗模塊飾可以驚在不濤被修鍋改的蜻前提雄下被缸擴(kuò)展停。換地言之起,應(yīng)處當(dāng)可晴以在是不必僵修改院源代教碼的威情況蝶下改啊變這挑個(gè)模麻塊的小行為眉。裹這個(gè)燒原則歸實(shí)際犧上是百對(duì)“顆對(duì)可別變性覆的封臉閉原確則“壤:找口到一都個(gè)系肌統(tǒng)的椅可變者因素剪,將恨之封思裝起扮來(lái)申。這吹個(gè)原鴉則意魂昧著努兩點(diǎn)繞:鋒1)拴一最個(gè)可如變性邪不應(yīng)附當(dāng)散放落在攔代碼舒的很辱多角里落里灑,而友應(yīng)當(dāng)好被封礦裝到酒一個(gè)軟對(duì)象傭里面拘。同岔一種加可變秒性的福不同宿表象賠意昧株著同毛一個(gè)淺繼承路等級(jí)窯結(jié)構(gòu)來(lái)中的擁具體塵子類仰。托繼承較就當(dāng)旅被看占作是欠封裝押變化言的方據(jù)法,朗而不掘應(yīng)當(dāng)平被認(rèn)祖為是圾從一度般的息對(duì)象蝴生成大特殊晚對(duì)象名的方某法盤。膀2)升一持種可言變性守不應(yīng)艦當(dāng)與通另一亡種可賤變性床混合擔(dān)在一舊起。年(所袋有類摩圖的特繼承賢結(jié)構(gòu)潛一般修不會(huì)悠超過(guò)游兩層居,不騾然就論意昧甲著將擱兩種案不同申的可腰變性來(lái)混合度在了涼一起投。)差這個(gè)斤原則王是總貼的原頂則,幟其它死幾條甩是這淘個(gè)原壞則的炸手段坦和工焦具。蔥2、默里氏爽替代余原則共(L踐is岔ko竹v壓Su乎bs弦ti秩tu蛛ti這on窗P偉ri御nc畜ip好le芒,或建者L脂SP攀);皂如果節(jié)對(duì)于臺(tái)每一昌個(gè)類桌型為合T1吩的對(duì)報(bào)象o扯1,爬都有緩類型飛為T魯2的散對(duì)象新o2掘,使勾得以進(jìn)T1萬(wàn)定義士的所者有程緊序P夠在所毛有的鏡對(duì)象債o1照都代植換成培o2末時(shí),斧程序褲P的暢行為棚沒有軟變化獵,那自么類罰型T絨2是涉類型變T1贈(zèng)的子摘類型化。啄換言濁之,咸一個(gè)騙軟件才實(shí)體警如果述使用稻的捉是一渡個(gè)基趴類的終話,肯那么料一定備適用海于其武子類驢,而粒且它霸根本田不能忽察覺廁出基奶類對(duì)約象和裁子類沈?qū)ο笳碌膮^(qū)疼別。莖反過(guò)悔來(lái)代嗽換不倡成立叉。補(bǔ)3、廢依賴?yán)^倒轉(zhuǎn)菜原則求(D離ep蜘en噸de音nc蒜y捎In漠ve撲rs議io習(xí)n獸Pr膚in晝ci撿pl隔e,春或者符DI近P)排;儲(chǔ)要依彼賴于玉抽象掀,不稀要依澇賴于果具體揭。愁開閉抽原則扮是目池標(biāo),燦而達(dá)滔到這校一目慕標(biāo)的膀手段亞是依燕賴倒糕轉(zhuǎn)原涂則。問(wèn)抽象寄層次瞎包含肥的是歡應(yīng)用哨系統(tǒng)價(jià)的商丘務(wù)邏港輯和凡宏觀裂的、穿對(duì)整列個(gè)系映統(tǒng)來(lái)突說(shuō)重昂要的撓戰(zhàn)略顧性決縮定,沈是必瓦然性閣的體較現(xiàn),域那么惱抽象貼層次神就應(yīng)贊當(dāng)是瓜較為串穩(wěn)定胞的,伸應(yīng)當(dāng)毅是復(fù)枕用的勞重點(diǎn)渾;也推應(yīng)當(dāng)完是維修護(hù)的達(dá)重點(diǎn)維;而炕具體濕層次泥則含舊有一要些次律要的鞋與實(shí)著現(xiàn)有構(gòu)關(guān)的苗算法破和邏貓輯,鴨以及遭戰(zhàn)術(shù)治性懷的決疼定,繼帶有輔相當(dāng)率大的賺偶然適性選袖擇。建具體碰層次寸的代站碼是屈會(huì)經(jīng)棄常有檢變動(dòng)裁的,汗不能娘避免微出現(xiàn)槽錯(cuò)誤精。豎4、弦接口戲隔離禍原則蹲(I攔nt緩er譽(yù)fa論ce顯S季eg駁re筋ga底ti裳on刃P炒ri維nc園ip田le由,或豎者I皺SP耽);故使用臥多個(gè)裕專門欲的接剛口比閑使用騾單一答的總大接口定要好修。的換言姑之,隆從一胸個(gè)客恰戶類即的角泳度講掘:一悠個(gè)類施對(duì)另盡一個(gè)飾類的健依賴式性應(yīng)丙當(dāng)是落建立加在最典小的獨(dú)接口冒上的潤(rùn)。御接口題隔離援原則忘與迪蜻米特泄法則良(下渠面講客到)誠(chéng)都是倉(cāng)對(duì)一辟個(gè)軟萍件實(shí)輸體與喉其他險(xiǎn)的軟護(hù)件實(shí)假體的肆通信采限制租。迪港米特鄙原則萄要求穩(wěn)盡可冒能地拼限制占通信境的寬央度和樂深度租,接繳品隔洗離原芒則要汪求通廉信的忌寬度業(yè)盡可幅能地由窄。推這樣址做的擾結(jié)果矩使一飾個(gè)軟敏件系焦統(tǒng)在模功能額擴(kuò)展融過(guò)懇程當(dāng)揭中,鹿不會(huì)柱將修播改的步壓力袖傳遞格到其露他對(duì)戒象。練一個(gè)觀接口蠶相當(dāng)藥于劇烈本中陶的一華種角舊色,員而此項(xiàng)角色革在一侮個(gè)舞僵臺(tái)上便由哪莖一個(gè)同演員械來(lái)演腦則相探當(dāng)于丸接口遭的實(shí)磁現(xiàn)。旁因此孩,一片個(gè)接椅口應(yīng)兆當(dāng)簡(jiǎn)舉單地驗(yàn)代表耗一個(gè)業(yè)角色竄,而秀不是咬多個(gè)刺角色葉。如昆果系橫統(tǒng)涉盛及到術(shù)多個(gè)命角色喪的話跌,那輕么每助一個(gè)佳角色慨都應(yīng)認(rèn)當(dāng)由躲一個(gè)逝特定乓的接慣口代舞表。鴨5、青組合病/聚狐合復(fù)隨用原疤則(屢Co淡mp戒os禿it世io受n/和Ag建gr蜂eg脾at蘿io苦n計(jì)Pr催in斬ci煎pl逐e,陪或者兄CA耕RP削);社組合況/聚內(nèi)合原菠則就鎖是在橫一個(gè)校新的枯對(duì)象易里面防使用養(yǎng)一些憂已有輝的對(duì)漲象,委使之笑成為隱新對(duì)企象的嫌一部鈴分;鞠新的吩對(duì)象市通過(guò)踩向這哭些對(duì)揮象的挖委派卸達(dá)到城得復(fù)鞠用已校有功字能的竿目的欣。遼要盡辜量使顆用嘴組合周/聚采合,野盡量渠不要礙使用備繼承劈。爹6、腫迪米扇特法紀(jì)則(校La凳w騾of天D逢em逗et秧er麗,或續(xù)者L囑oD竹);凈一個(gè)歸軟件易實(shí)體好應(yīng)當(dāng)江盡可貧能少虜?shù)呐c莖其他亡實(shí)體予發(fā)生抓相互槍作用輪。模夢(mèng)塊之放間的斤交互澤要少脈。這督樣做排的結(jié)糕果是村當(dāng)系文統(tǒng)的承功能仆需要貢擴(kuò)展之時(shí),瞞會(huì)相禽對(duì)更弊容易靜地做站到對(duì)便修改慎的關(guān)擦閉。捏一個(gè)豐對(duì)象深應(yīng)當(dāng)大對(duì)其苗他對(duì)軍象有鑒盡可應(yīng)能少界的了貼解???、嘴單一扒職責(zé)富原則友(S胸in蚊gl缸e嫁Re嫂sp屈on伏si姨bi憂li芬ty賣P帳ri梳nc移ip伶le僵,或雄者S蓮RP偽)坦在設(shè)裹計(jì)中必為每緣種職尸責(zé)設(shè)播計(jì)一矩個(gè)類談,彼儀此保季持正志交,罵互不火干涉堪。這撥個(gè)原撞則比享較容圈易理坑解,癥這里唇不在級(jí)多說(shuō)重。裕間無(wú)
小搖結(jié)謝冷繁
當(dāng)銷我們?cè)抡莆沼屏薈推#的景語(yǔ)哪法,摸當(dāng)我征們了論解了僅面向壽對(duì)象河的封抓裝、窩繼承黃、多上態(tài)等血特性演,當(dāng)債我們歌可以女用各盛種框級(jí)架與牛技術(shù)述構(gòu)建丟桌面毫以及顫We性b應(yīng)矮用時(shí)惠,這民并不個(gè)意味艙著我鏈們可諷以寫地出面若向?qū)γは蟮氖吵绦虼?,不?yáng)意味先著我厘們可名以很息好的吵實(shí)現(xiàn)潮代碼鳴復(fù)用闊,彈惹性維岔護(hù),題不意懷味著秧我們乘可以旱實(shí)現(xiàn)謝在維義護(hù)、陣擴(kuò)展臂基礎(chǔ)鉛上的撿代碼歐復(fù)用劍。舍使用車面向牽對(duì)象鵝語(yǔ)言丹開發(fā)滑的程蜜序不戒一定捎是面麥向?qū)δz象的紋,墊使用錫面向腎過(guò)程齒的語(yǔ)斜言開喚發(fā)的贏程序勞也不牢一定適不是長(zhǎng)面向們對(duì)象笑的。助要想鎮(zhèn)開發(fā)狂出一鉆個(gè)具帥有可躺維護(hù)痛性和牽可復(fù)纏用性計(jì)的軟贊件系眠統(tǒng),菊那是德需要焦優(yōu)秀口的設(shè)給計(jì)和挖長(zhǎng)時(shí)其間的睜運(yùn)行花才能炭完成賭的,沙其實(shí)鑄我們甘可以埋觀察炕一下稀,任怪何一珍個(gè)優(yōu)口秀的打軟件追產(chǎn)品弓都是消經(jīng)過(guò)增長(zhǎng)時(shí)喜間的刃設(shè)計(jì)渾,運(yùn)枝行,恰維護(hù)鮮,修授改等疼最后喬才成敞為成壯功的飽產(chǎn)品仆,版晚本上貌也在兇不斷偉的更絲新。體衡量租一個(gè)墳軟件質(zhì)開發(fā)句者是俘不是仿一個(gè)丈好的愉軟件粘開發(fā)笑者,謎不是罰看他至是否壇實(shí)現(xiàn)倉(cāng)了軟妥件的貨必要佩功能蒙,而態(tài)是要添看你宗的軟食件在問(wèn)滿足似功能右需求蠶的情傲況下針是否冰做到臭了復(fù)循用性繁和可喬擴(kuò)展榆性,耀這對(duì)氣于一京個(gè)大境型系異統(tǒng)尤稠其重陵要。饑我們蟲不要述靜止蝴的看串待一靠個(gè)軟蒜件,黎而一它定要調(diào)把軟邀件過(guò)寫程放憐在時(shí)畏間軸赤上來(lái)宜觀察矩與設(shè)怖計(jì)它固,只微有放獄在時(shí)富間軸續(xù)上經(jīng)令得住拴考驗(yàn)周的軟創(chuàng)件系群統(tǒng)才嚴(yán)是成嘩功的反。軟愧件的荒復(fù)用乓性和騰可擴(kuò)船展性曬對(duì)于浸大型賤系統(tǒng)穩(wěn)是必懸要的堪,我女們?cè)谌樵O(shè)計(jì)蔑自己駛的軟襖件系中統(tǒng)時(shí)滾,甚谷至在跳編寫踩代碼日時(shí)更松需要糞考慮覆一下霧這樣漆做是秘否遵康循了簽系統(tǒng)絞設(shè)計(jì)領(lǐng)的原圾則,勾是否解有利恰于系靠統(tǒng)的獅可維式護(hù)性授和可制復(fù)用和性,飽是否劫達(dá)到雨了常湖說(shuō)的膠“高比內(nèi)聚丑低耦掃合”認(rèn)呢?戰(zhàn)設(shè)計(jì)瞎模式峰正是匆解決餡這一翼問(wèn)題糾的王單道。德追刑
從似下文欄開始遙我們愧將結(jié)次合實(shí)榮例對(duì)估于G達(dá)oF灶23叢種設(shè)兩計(jì)模圖式進(jìn)學(xué)行一醬一講咬解。端現(xiàn)在男我們革正式凝進(jìn)入內(nèi)Go舌F2植3種逮設(shè)計(jì)星模式胞中的親創(chuàng)建弄型模郊式的粒講解沉中來(lái)窯,創(chuàng)踐建型父模式設(shè)主要捆解決妻對(duì)象陷如何許創(chuàng)建先的問(wèn)蠢題,袖提倡灶創(chuàng)建大對(duì)象被的責(zé)御任和敲使用獵對(duì)象琴的責(zé)網(wǎng)任分起離,縣以達(dá)烘到更急好對(duì)推創(chuàng)建亦對(duì)象玩的控廈制的摟目的迎,創(chuàng)桂建型贏模式滿主要斷包括帥抽象攏工廠猴(A沉bs間tr堅(jiān)ac輛t敘Fa牲c(diǎn)t外or香y)偷,建直造者樂(B客ui吵ld椅er匯),孫工廠識(shí)方法響(F知ac可to息ry茅M趴et策h(yuǎn)o月d)次,原掉型(別Pr選ot肺ot倚yp饑e)撫,單世子(移Si溫ng稻le某to六n)犧。偶這篇達(dá)文章飛主要浮分為亞兩大游部分醉內(nèi)容蹤,在滑第一咽部分判中我固將介劉紹抽總象工新廠模下式的糾原型她,包回括抽綁象工閃廠的集意圖胳,可族以解螺決的扭問(wèn)題徑,原戲型代粒碼和滴UM桑L等荷,再窩結(jié)合襖一個(gè)眠生活度中的杰小例殊子進(jìn)之行原防型的望說(shuō)明棉。第古二部考分我鞏會(huì)結(jié)峰合實(shí)勢(shì)際項(xiàng)唇目來(lái)龜講述標(biāo)一下擱抽象脊工廠友模式新是如偉何應(yīng)坦用的浮。最國(guó)后我吵會(huì)對(duì)師抽象岡工廠菜模式清進(jìn)行謹(jǐn)一個(gè)哭小結(jié)油。布遞丈
工明廠模院式的胃幾種退形態(tài)仔折向判工廠抄模式半專門賞負(fù)責(zé)掘?qū)⒋笮Я坑芯涔餐敖涌谕念惖蕦?shí)例睜化。馬工廠胳模式過(guò)可以抖動(dòng)態(tài)撇決定態(tài)將哪屆一個(gè)遠(yuǎn)類實(shí)盈例化謊,不羨必事瞞先知韻道每笨次要疾實(shí)例擦化哪粗一個(gè)城類。務(wù)工廠由模式始有以糠下幾村種形柄態(tài):肢簡(jiǎn)單怕工廠棕(S匠im森pl蠟e瞎Fa銅ct慚or斥y)太模式索:佩又稱姐靜態(tài)廈工廠孫方法勿模式鴉(S疲ta脫ti卸c撿Fa走ct和or制y展Me早th基od旗P芹at荷te纖rn驕)。姥主要綢是工棗廠中挖提供魯一個(gè)郊靜態(tài)弱的方之法用汪來(lái)根知據(jù)不足同的絕參數(shù)蹤創(chuàng)建幟不同幟的抽而象產(chǎn)密品的初具體沖實(shí)寸例,皺一般遞在I嶼oC謎中應(yīng)村用比靠較多衣,例頓如通慰過(guò)反籍射機(jī)矛制和喪簡(jiǎn)單翅工廠扁模式著可以悲解決嗽依賴橫注入奮的問(wèn)畜題。部簡(jiǎn)單詠工廠劃模式鴿不屬劈于G哨oF幸23肆種設(shè)蓋計(jì)模悅式,瘦這里奔也就磁不再晴作過(guò)穴多的災(zāi)分析姻。感身興趣郊的園爺友可化以找責(zé)找相僑關(guān)資孟料。辱工廠訊方法臭(F務(wù)ac榨to烏ry蓬M洽et咐ho摸d)愈模式冤:模又稱蹤多態(tài)予性工滑廠(耀Po堆ly遠(yuǎn)mo雨rp欣hi燃c鑒Fa寒ct流or飽y)守模式蜓或虛橋擬構(gòu)杠造子躲(V坑ir麻tu志al虹C鐘on冰st融ru劉ct枝or姥)模吹式。期這個(gè)膀模式瓦屬于汽Go喇F2悲3種比設(shè)計(jì)農(nóng)模式夏之萄一,均在后指面的焦文章扔中會(huì)致做詳遺細(xì)的右介紹樂。賽抽象勿工廠鑒(A內(nèi)bs苗tr末ac勁t疤Fa陜ct棗or贊y)竿模式場(chǎng):技又稱睬工具掌箱(巴Ki設(shè)t或貍To炕ol哭ki桿t)鐵模式咐。賭這是嚷本文圈的重較點(diǎn)。椅忽維
抽抓象工嬌廠模昨式的成原型花準(zhǔn)罪壇描述臟:似椒鋤
假凡設(shè)一功個(gè)子捆系統(tǒng)偽需要保一些停產(chǎn)品稿對(duì)象橋,而遙這些恨產(chǎn)品調(diào)對(duì)象吸又屬奶于一扁個(gè)以壁上的竿產(chǎn)品者等級(jí)目結(jié)構(gòu)熔。那細(xì)么為方了將擾消費(fèi)究這些脹產(chǎn)品妙的責(zé)盯任和衰創(chuàng)建不這些最產(chǎn)品向?qū)ο笾碌呢?zé)發(fā)任分或割開筆來(lái),慕可以獲引進(jìn)付抽象卷工廠社模式贈(zèng)。這北樣的鼻話,面消費(fèi)快產(chǎn)品壘的一鑰方不趨需要袖直接兼參與泛產(chǎn)品古的創(chuàng)掉建工這作,鞏而只錄需要舞向一烘?zhèn)€公容用的素工廠晴接口梯請(qǐng)求牛所需貿(mào)要的果產(chǎn)品普。巨俯秒謹(jǐn)意圖叨:爹丹裁
抽暢象工片廠模森式可臺(tái)以姻向客冶戶端胸(C匹li偶en原t指陸代碼資模式覽的使磨用者由,后棄文類排同)規(guī)提供患一個(gè)癥接口宮,使貸得客熟戶端核在不蝕必指巖定產(chǎn)才品的房具體翻類型搜的情烘況下足,創(chuàng)戲建多把個(gè)產(chǎn)篩品族貞(P淋ro蔽du打ct扶F迎am認(rèn)il擠y指軍位于俊不同稈產(chǎn)品監(jiān)等級(jí)殊中,甲功能攻相關(guān)毛聯(lián)的閱產(chǎn)品盟的集別合)嚷中的肌產(chǎn)品問(wèn)對(duì)象送。搬束唇案模式志原型希UM壤L:聰把榜揮笨鼻
抽令象工啊廠涉笑及到月以下刃角色櫻:警安明
抽腦象工縮廠(限Ab疑st甲ra程ct遮Fa吧ct芒or甜y便)角東色:奔聲明遭一個(gè)扔操作的集合凱的接嫩口以揭創(chuàng)建稼抽象扒產(chǎn)品刪族。披鏈庭
具客體工跑廠(好Co所nc盲re外te慣Fa傾ct嫩or咱y)怨角色虧:實(shí)演現(xiàn)創(chuàng)量建具挪體產(chǎn)棄品族基的抽盈象工期廠的親實(shí)現(xiàn)擠。疾炒傅
抽始象產(chǎn)誠(chéng)品(欠Ab漁st短ra尿ct召Pr查od姓uc雹t跨)角但色:走聲明慢一個(gè)掀產(chǎn)品缸的接女口。帝懶拍
具愁體產(chǎn)銷品(棋Pr蹦od餅uc喜t)知角色腫:定棚義了楊一個(gè)肥被具詢體工巴廠創(chuàng)寶建的拐產(chǎn)品田對(duì)象索,實(shí)博現(xiàn)了畢抽象鍛工廠賭接口郊。鍋停廈
客躺戶端勾(C計(jì)li熊en繪t)禍角色滑:使丑用抽威象工杜廠和惜抽象俘產(chǎn)品脊的類餃。徐哲摸繼模抽式原倦型代悶碼:usingSystem;namespaceDesignPatterns.Creational{羨蕩維//號(hào)測(cè)牌試程口序花特盡cl飽as紅s交Ma番in伍Ap三p呀木蘆{附蹦泡清箭pu畏bl昆ic苗s胖ta在ti侍c躬vo打id西M蒙ai敬n(柿)騎臨織嫁距{紛包叉繳減闊有//歉抽拴象工防廠1減冬牧死闖沉走杜Ab餃st鴿ra梨ct恒Fa患ct走or的y歉fa千ct瞎or令y1拴=挑n蛋ew撥C陵on臣cr破et比eF冰ac躍to督ry戶1(志);懇電慌擋功零廊Cl姥ie馳nt蔽c安1束=所ne撓w萄C勻li傷en城t(爽fa守ct伐or發(fā)y1這);趕室奏口歌褲該c1團(tuán).R瞇un靠()用;凝單役恒的啄早//針抽綁象工欲廠2撥雹議達(dá)勉歇慮鼓Ab撿st已ra揀ct遞Fa炭ct匯or糕y挑fa換ct蜂or鋒y2斑=效n跡ew寧C缸o(hù)n挨cr戲et穩(wěn)eF隆ac評(píng)to島ry紀(jì)2(界);款替陷施罪框喇Cl濤ie燈nt惠c志2擊=橋ne勇w唉Cl許ie訴nt劇(f燃ac到to館ry抱2)矩;士狗辮偶妨姜植c2唐.R跌un叮()粱;形丘補(bǔ)畝臺(tái)怠芳//惱等付候用臣戶輸疫入貸虹診勝帶宣旗Co石ns汽ol所e.融Re搏ad潮()蛛;耀畢藝安卵}榴淋絕}書擺奶//剖抽慌象工鉗廠憶準(zhǔn)奶ab詞st奔ra劈c(diǎn)t農(nóng)c鞠la幕ss茂A笨bs認(rèn)tr盈ac宮tF旅ac艘to幻ry她漆圣{斜租賴酒腫pu冒bl矩ic著a厚bs乒tr愉ac后t監(jiān)Ab適st透ra疑ct態(tài)Pr貝od斗uc辟tA蔑C您re寄at遙eP遍ro家du兔ct李A(yù)(別);叛夕櫻銳春pu務(wù)bl談ic盞a查bs直tr盲ac路t訓(xùn)Ab懸st租ra坑ct勇Pr敏od撞uc欺tB數(shù)C矩re龍at肉eP液ro陡du臘ct忘B(駛);記偷愚}牧喊兆//博具辦體工船廠1青垮兔cl蠻as游s永Co弄nc消re殃te客Fa岡ct拆or櫻y1徑:皂A蚊bs勿tr夢(mèng)ac辜tF夕ac澆to惕ry恨允京{證挺賊爛pu哲bl員ic兼o竊ve胖rr冊(cè)id壞e質(zhì)Ab撕st燈ra攜ct偽Pr況od張uc羅tA礦C裝re炕at仰eP思ro煤du供ct衫A(宜)喚村治酒提{裁井膝委疑提障re征tu嗎rn味n穿ew淹P儉ro肅du奴ct收A1透()斑;仿許善舟責(zé)}沿籃要碼偉pu五bl萄ic概o唐ve瞎rr跟id知e譯Ab六st葡ra仍ct耐Pr姻od危uc翻tB償C鹽re枯at典eP笨ro哲du擋ct初B(匆)六鉆拳劃押{飛嶼餐李歪費(fèi)師re龍tu邊rn如n鵲ew列P據(jù)ro唐du墻ct獻(xiàn)B1攻()跑;映妨漿限共}經(jīng)壺傾}熱渴漫//謊具遷體工鹿廠2待霜營(yíng)cl著as塞s掩C旺on兼cr層et尚eF嚷ac框to敞ry災(zāi)2諷:馬Ab過(guò)st貝ra鋒ct綿Fa金ct旅or妙y圈愧蛾{蔑箏階政姐pu奶bl植ic浙o艱ve錯(cuò)rr寬id什e塑Ab扎st駱ra搞ct蕉Pr慢od軌uc膝tA驢C香re駝at斯eP系ro釣du碰ct漂A(腫)辣碑旺豬喂{野模盾員證灰說(shuō)re穴tu惠rn拿n暑ew法P卷ro娘du輔ct超A2挨()朵;巧撈理健湊}虛蘿假串苦pu屠bl攻ic盆o南ve擠rr靈id聾e位Ab徐st首ra遼ct級(jí)Pr測(cè)od蹦uc發(fā)tB似C胃re顏at禾eP對(duì)ro妥du劣ct回B(侄)短壯饑法交{朽惹法臥申犯溪re輝tu龜rn例n看ew雅P懂ro嘉du象ct襖B2歇()渠;落太嘉普背}亞翅波}鼓母層//彩抽奧象產(chǎn)雁品A矩,產(chǎn)村品族濟(jì)中一禿個(gè)成燙員且畝援a(chǎn)b塵st占ra努ct貫c壩la懸ss理A嚷bs谷tr陶ac洽tP瓣ro愈du數(shù)ct澤A請(qǐng)止幻{詢固輸}僅霧挨//鋒抽野象產(chǎn)便品B燒,產(chǎn)靜品族耀中一孝個(gè)成注員蓋諒蠅ab抵st種ra泉ct安c個(gè)la喜ss鴿A任bs企tr陳ac爹tP復(fù)ro蹈du鑼ct挑B崗跳鉤{也赴打閘蛛pu歉bl泄ic移a薦bs銜tr始ac裕t愉vo臭id念I(lǐng)鋸nt良er議ac汪t(演Ab縫st貨ra紡ct訊Pr肝od欣uc渠tA遼a技);冬貍孟}勸吵岸//為具鋤體產(chǎn)借品A哨1廚權(quán)遭cl團(tuán)as見s肝Pr持od捷uc侍tA錢1陰:糖A北bs繡tr漂ac竟tP爬ro段du睡ct女A單斜染{留柴婚}戚棄姿//警具翼體產(chǎn)叮品B島1燈躺路cl羞as謎s銳Pr燃o(jì)d泛uc朝tB背1益:謙Ab檢st狐ra圾ct礦Pr堤od昆uc父tB傻腹廚{驚小統(tǒng)滾屢pu吧bl領(lǐng)ic磚o割ve釘rr仍id難e鴉vo喘id辛I劍nt康er室ac績(jī)t(纏Ab字st星ra室ct異Pr保od唉uc蕉tA千a壁)濕曠掃橫消{款伍剛看到剪異Co慰ns凳ol宇e.片Wr尋it爆eL布in齒e(寇th守is完.G廣et窗Ty垮pe哀()自.N犁am備e迅+鐮蜻織椅擋只督厘"照in逢te體ra賺ct港s摟wi惕th胳"覆+野a撇.G腰et遺Ty翠p疑e(宗).借Na掘me進(jìn));循對(duì)資雅瀉}憐妄彎}撐曉旗//新具櫻體產(chǎn)兄品A量2衛(wèi)棄合cl鎖as雕s坑Pr宰o(hù)d架uc休tA瞎2擴(kuò):鎖Ab的st胞ra霧ct切Pr償od槍uc岡tA瞎體觸{蔽限貓}稍顫怕//汗具帆體產(chǎn)宴品B中2桶沖草cl蛙as某s柜Pr木od縣uc散tB側(cè)2測(cè):懸Ab溉st吐ra鐮ct狹Pr鳴od惠uc叼tB架霞棋{薪背電值師pu下bl耐ic項(xiàng)o鮮ve菌rr宵id黎e槽vo和id刃I克nt儲(chǔ)er賠ac醬t(開Ab商st蘇ra鳴ct耀Pr反od睬uc答tA欄a搏)對(duì)竄頂爆烘{祝覽車坐邁釀近Co饒ns罷ol痰e.虛Wr錫it也eL鋒in慰e(扯th滾i算s.蛾Ge激tT線yp庭e(漂).奶N(yùn)a籌me棄+蠟獵震洽格帖遍潛"慶in繁te拾ra售ct獵s搜wi下th會(huì)"惜+靈a訊.G膊et舌Ty族pe字()鋤.N濤am陜e)教;慌借鴿柳冒}繁雹萌}含掩尚//諷客程戶端稍,使雜用環(huán)祖境延王除cl虎as絞s懲Cl乏ie助nt底根愚{則秧蠢衰像pr葛iv負(fù)at消e畢Ab斜st吸ra耍ct角Pr號(hào)od林uc脾tA抄A覆bs梅tr檢ac帽tP妨ro齒du守ct趙A;恰紅藍(lán)矩隨pr挪iv錢at慢e傭Ab橡st藝ra他ct塑Pr歐od傻uc食tB秩A蝦bs塑tr輪ac厚tP白ro架du錄ct縱B;鑄菜下迷頁(yè)//匯構(gòu)病造,白注意澆通過(guò)楊構(gòu)造襪傳入描抽返象工倒廠俯順貌敗病pu敢bl而ic鄉(xiāng)C推li爽en殼t(漆Ab泳st糟ra這ct蹄Fa摟ct雹or恨y屠fa依ct甘or漢y)零航辱棒花{榜匹索獵陡像毀Ab胸st型ra賴ct陜Pr稼od扒uc決tB績(jī)=必f夜ac績(jī)to營(yíng)ry詢.C揀re甚at皂eP財(cái)ro泥du集ct盆B(食);亞制勞示做媽媽Ab拾st銹ra倒ct票Pr頭od注uc曬tA刷=牛f執(zhí)ac蔬to都ry矮.C換re杜at束eP搬ro浴du儉ct姓A(幼);冒享斬聽蹦}初嚴(yán)獻(xiàn)粱墾pu摧bl站ic未v板oi畫d腦Ru筍n(斬)酸淡盞望烤{婚扒儉幅國(guó)蒼厭Ab積st胸ra裙ct役Pr葵od吃u(píng)c聽tB環(huán).I荒nt擇er歐ac翼t(欺Ab揪st唱ra站ct采Pr往od哥uc厚tA穗);坐機(jī)免貪亂}突緊耕}挑}輸出結(jié)果為:ProductB1interactswithProductA1ProductB2interactswithProductA2生活中的實(shí)例:這個(gè)生活中的實(shí)例代碼演示了一個(gè)電腦游戲,在游戲中建立不同的動(dòng)物世界會(huì)使用不同的工廠。雖然創(chuàng)建動(dòng)物的大陸工廠是不同的,但是動(dòng)物之間的相互關(guān)系保持不變。RealworldcodeusingAbstractFactoryinC#usingSystem;{classMainApp{publicstaticvoidMain(){//創(chuàng)建非洲大陸ContinentFactoryafrica=newAfricaFactory();AnimalWorldworld=newAnimalWorld(africa);world.RunFoodChain();//創(chuàng)建美洲大陸ContinentFactoryamerica=newAmericaFactory();world=newAnimalWorld(america);world.RunFoodChain();//等待用戶輸入Console.ReadKey();}}//抽象工廠abstractclassContinentFactory{//創(chuàng)建食草動(dòng)物publicabstractHerbivoreCreateHerbivore();//創(chuàng)建食肉動(dòng)物publicabstractCarnivoreCreateCarnivore();}//具體工廠1classAfricaFactory:ContinentFactory{publicoverrideHerbivoreCreateHerbivore(){//返回牛羚returnnewWildebeest();}publicoverrideCarnivoreCreateCarnivore(){//返回獅子returnnewLion();}}//具體工廠2classAmericaFactory:ContinentFactory{publicoverrideHerbivoreCreateHerbivore(){//返回野牛returnnewBison();}publicoverrideCarnivoreCreateCarnivore(){//返回狼returnnewWolf();}}//抽象產(chǎn)品AabstractclassHerbivore{}//抽象產(chǎn)品BabstractclassCarnivore{//交互關(guān)系,食肉動(dòng)物可以吃掉食草動(dòng)物publicabstractvoidEat(Herbivoreh);}//具體產(chǎn)品A1classWildebeest:Herbivore{}//具體產(chǎn)品B1classLion:Carnivore{publicoverridevoidEat(Herbivoreh){//吃掉牛羚Console.WriteLine(this.GetType().Name+"eats"+h.GetType().Name);}}//具體產(chǎn)品A2classBison:Herbivore{}//具體產(chǎn)品B2classWolf:Carnivore{publicoverridevoidEat(Herbivoreh){//吃掉野牛Console.WriteLine(this.GetType().Name+"eats"+h.GetType().Name);}}//客戶端classAnimalWorld{privateHerbivore_herbivore;privateCarnivore_carnivore;//通過(guò)構(gòu)造器傳入具體工廠publicAnimalWorld(ContinentFactoryfactory){_carnivore=factory.CreateCarnivore();_herbivore=factory.CreateHerbivore();}publicvoidRunFoodChain(){_carnivore.Eat(_herbivore);}}}RealworldcodeusingAbstractFactoryinC#輸出的結(jié)果為:LioneatsWildebeestWolfeatsBison
什么情況下使用抽象工廠:文獻(xiàn)【GOF95】指出,在以下情況下應(yīng)當(dāng)考慮使用抽象工廠模式:1.一個(gè)系統(tǒng)不應(yīng)當(dāng)依賴于產(chǎn)品類實(shí)例如何被創(chuàng)建、組合和表達(dá)的細(xì)節(jié),這對(duì)于所有形態(tài)的工廠模式都是重要的。2、這個(gè)系統(tǒng)的產(chǎn)品有多于一個(gè)產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一個(gè)族的產(chǎn)品(上面這一條叫做抽象工廠模式的原始用意。)3、同屬于同一個(gè)產(chǎn)品族的產(chǎn)品是在一起使用的,這一約束必須在系統(tǒng)的設(shè)計(jì)中體現(xiàn)出來(lái)。4、系統(tǒng)提供一個(gè)產(chǎn)品類的庫(kù),所有的產(chǎn)品以同樣的接口實(shí)現(xiàn),從而使客戶端不依賴于實(shí)現(xiàn)。實(shí)際項(xiàng)目舉例
現(xiàn)在需要?jiǎng)?chuàng)建分屬于不同操作系統(tǒng)的視窗構(gòu)件。比如命令按鈕(Button)與文本框(Text)等都是視窗構(gòu)件,在UNIX系統(tǒng)的視窗環(huán)境和Windows操作系統(tǒng)的視窗環(huán)境中,這兩個(gè)構(gòu)件有不同的本地體現(xiàn),它們的細(xì)節(jié)也有所不同。在每一個(gè)操作系統(tǒng)中,都有一個(gè)視窗構(gòu)件組成構(gòu)件家族。在這里就是Button和Text組成的產(chǎn)品族。而每一個(gè)視窗構(gòu)件都構(gòu)成自己的等級(jí)結(jié)構(gòu),由一個(gè)抽象角色給出抽象的功能描述,而由具體子類給出不同操作系統(tǒng)的具體實(shí)現(xiàn),如下圖所示。
可以發(fā)現(xiàn)在上面的產(chǎn)品類圖中,有兩個(gè)產(chǎn)品的等級(jí)結(jié)構(gòu),分別是Button等級(jí)結(jié)構(gòu)和Text等級(jí)結(jié)構(gòu)、同時(shí)有兩個(gè)產(chǎn)品族,也就是UNIX產(chǎn)品族和Windows產(chǎn)品族。UNIX產(chǎn)品族由UnixButton和UnixText產(chǎn)品組成;而Windows產(chǎn)品族由WinButton和WinText產(chǎn)品構(gòu)成。
系統(tǒng)對(duì)產(chǎn)品對(duì)象的創(chuàng)建需求由一個(gè)工廠的等級(jí)結(jié)構(gòu)滿足,其中有兩個(gè)具體工廠角色,即UnixFactory和WinFactory。UnixFactory對(duì)象負(fù)責(zé)創(chuàng)建Unix產(chǎn)品族中的產(chǎn)品,而WinFactory對(duì)象負(fù)責(zé)創(chuàng)建Windows產(chǎn)品族中的產(chǎn)品。這就是抽象工廠模式的應(yīng)用,抽象工廠模式的解決方案如下圖所示。
顯然,一個(gè)系統(tǒng)只能夠在某一個(gè)操作系統(tǒng)的視窗環(huán)境下運(yùn)行,而不能夠同時(shí)在不同的操作系統(tǒng)上運(yùn)行。所以,系統(tǒng)實(shí)際上只能消費(fèi)屬于同一個(gè)產(chǎn)品族的產(chǎn)品。這個(gè)案例實(shí)際上也正是抽象工廠模式的起源。實(shí)現(xiàn)的代碼如下。ProjectcodeusingAbstractFactoryinC#
輸出結(jié)果為:ProjectcodeusingAbstractFactoryinC#//抽象工廠起源案例usingSystem;{classMainApp{publicstaticvoidMain(){//創(chuàng)建Unix使用環(huán)境OSFactoryunix=newUnixFactory();Clientclient=newClient(unix);client.Run();//創(chuàng)建Windows使用環(huán)境OSFactorywindows=newWinFactory();client=newClient(windows);client.Run();//等待用戶輸入Console.ReadKey();}}//抽象工廠abstractclassOSFactory{//創(chuàng)建按鈕構(gòu)件publicabstractButtonCreateButton();//創(chuàng)建文本框構(gòu)件publicabstractTextCreateText();}//具體工廠1classUnixFactory:OSFactory{publicoverrideButtonCreateButton(){//返回Unix下的ButtonreturnnewUnixButton();}publicoverrideTextCreateText(){//返回Unix下的TextreturnnewUnixText();}}//具體工廠2classWinFactory:OSFactory{publicoverrideButtonCreateButton(){//返回Windows下的ButtonreturnnewWinButton();}publicoverrideTextCreateText(){//返回Winodws下的TextreturnnewWinText();}}//抽象產(chǎn)品AabstractclassButton{}//抽象產(chǎn)品BabstractclassText{//交互關(guān)系publicabstractvoidInteract(Buttonb);}//具體產(chǎn)品A1classUnixButton:Button{}//具體產(chǎn)品B1classUnixText:Text{publicoverridevoidInteract(Buttonb){Console.WriteLine(this.GetType().Name+"interactwith"+b.GetType().Name);}}//具體產(chǎn)品A2classWinButton:Button{}//具體產(chǎn)品B2classWinText:Text{publicoverridevoidInteract(Buttonb){Console.WriteLine(this.GetType().Name+"interactwith"+b.GetType().Name);}}//客戶端classClient{privateButton_button;privateText_text;//通過(guò)構(gòu)造器傳入具體工廠publicClient(OSFactoryfactory){_button=factory.CreateButton();_text=factory.CreateText();}publicvoidRun(){_text.Interact(_button);}}}UnixTextinteractwithUnixButtonWinTextinteractwithWinButton
小結(jié)
抽象工廠模式是一個(gè)在實(shí)際項(xiàng)目中應(yīng)用比較多的設(shè)計(jì)模式之一,抽象工廠模式面對(duì)的問(wèn)題是多個(gè)產(chǎn)品等級(jí)結(jié)構(gòu)的系統(tǒng)設(shè)計(jì),運(yùn)用抽象工廠模式的關(guān)鍵在于如果把創(chuàng)建產(chǎn)品的職責(zé)交給工廠去完成,希望大家在把握住工廠模式原型的基礎(chǔ)上盡量的考慮到應(yīng)用,形成一種思維上的定勢(shì)。這一篇我將向大家講解建造者(Builder)模式。在上一篇文章中我們主要學(xué)習(xí)了抽象工廠(AbstractFactory)模式,抽象工廠模式主要解決對(duì)不同等級(jí)結(jié)構(gòu)的產(chǎn)品的創(chuàng)建工作,主要關(guān)注的是創(chuàng)建哪一批產(chǎn)品的問(wèn)題,而本文所講的建造者模式主要是解決對(duì)于一個(gè)產(chǎn)品如何分部創(chuàng)建的問(wèn)題,這是對(duì)于建造者模式的最初描述。同樣,這篇文章主要分為兩大部分來(lái)講解,第一部分我會(huì)對(duì)建造者模式的原型進(jìn)行詳細(xì)的說(shuō)明,第二部分會(huì)對(duì)建造者模式如何解決具體問(wèn)題進(jìn)行探討。
建造者模式的原型描述:
在軟件系統(tǒng)中,有時(shí)候面臨一個(gè)"復(fù)雜對(duì)象"的創(chuàng)建工作,其通常由各個(gè)部分的子對(duì)象用一定算法構(gòu)成;由于需求的變化,這個(gè)復(fù)雜對(duì)象的各個(gè)部分經(jīng)常面臨著劇烈的變化,但是將它們組合到一起的算法卻相對(duì)穩(wěn)定。
建造者模式是對(duì)對(duì)象的創(chuàng)建模式。建造者模式可以將一個(gè)產(chǎn)品的內(nèi)部表象與產(chǎn)品的生成過(guò)程分隔開來(lái),從而可以使一個(gè)建造過(guò)程生成具有不同的內(nèi)部表象的產(chǎn)品對(duì)象。建造者模式利用一個(gè)導(dǎo)演者對(duì)象和具體建造者對(duì)象一個(gè)一個(gè)地建造出所有的零件,從而建造出完整的產(chǎn)品對(duì)象。建造者模式將產(chǎn)品的結(jié)構(gòu)和產(chǎn)品的零件建造過(guò)程對(duì)客戶端隱藏起來(lái),把對(duì)建造過(guò)程進(jìn)行指揮的責(zé)任和具體建造零件的責(zé)任分隔開來(lái),達(dá)到責(zé)任劃分和封裝的目的。
意圖:
將一個(gè)復(fù)雜對(duì)象的構(gòu)建與其表示相分離,使得同樣的構(gòu)建過(guò)程可以創(chuàng)建不同的表示。
模式原型UML:
建造者模式涉及到以下角色:
1、抽象建造者(Builder)角色:給出一個(gè)抽象接口,以規(guī)范產(chǎn)品對(duì)象的各個(gè)組成成分的建造。此接口中一般至少規(guī)定兩個(gè)方法,一個(gè)是創(chuàng)建部分的方法,例如BuilderPart,另一個(gè)是返回結(jié)果的方法,例如GetProduct,以約束具體建造者實(shí)現(xiàn)。
2、具體建造者(ConcreteBuilder)角色:擔(dān)任這個(gè)角色的是與應(yīng)用程序緊密相關(guān)的一些類,它們?cè)趹?yīng)用程序的調(diào)用下創(chuàng)建產(chǎn)品的實(shí)例。這個(gè)角色產(chǎn)品實(shí)現(xiàn)了抽象建造者接口,主要完成分部創(chuàng)建產(chǎn)品并提供產(chǎn)品對(duì)象的實(shí)例。
3、導(dǎo)演者(Director)角色:顧名思義,就
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東外語(yǔ)外貿(mào)大學(xué)南國(guó)商學(xué)院《交際口語(yǔ)(Ⅲ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東體育職業(yè)技術(shù)學(xué)院《勞動(dòng)經(jīng)濟(jì)學(xué)(雙語(yǔ))》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東司法警官職業(yè)學(xué)院《生化分離與分析技術(shù)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東食品藥品職業(yè)學(xué)院《管理學(xué)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東省外語(yǔ)藝術(shù)職業(yè)學(xué)院《環(huán)境流體力學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東輕工職業(yè)技術(shù)學(xué)院《環(huán)境影響評(píng)價(jià)A》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東農(nóng)工商職業(yè)技術(shù)學(xué)院《創(chuàng)業(yè)文案寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東梅州職業(yè)技術(shù)學(xué)院《新聞傳播調(diào)查方法與寫作》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東茂名健康職業(yè)學(xué)院《全網(wǎng)規(guī)劃與部署》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東茂名農(nóng)林科技職業(yè)學(xué)院《先進(jìn)材料科技進(jìn)展》2023-2024學(xué)年第一學(xué)期期末試卷
- (八省聯(lián)考)2025年高考綜合改革適應(yīng)性演練 語(yǔ)文試卷(含答案解析)
- 數(shù)字媒體技術(shù)應(yīng)用基礎(chǔ)知識(shí)單選題及答案解析
- 面部抗皺培訓(xùn)課件
- 2025年高考?xì)v史復(fù)習(xí)之小題狂練300題(選擇題):世界多極化與經(jīng)濟(jì)全球化(20題)
- ISO 56001-2024《創(chuàng)新管理體系-要求》專業(yè)解讀與應(yīng)用實(shí)踐指導(dǎo)材料之1:0 引言(雷澤佳編制-2025B0)
- 2024版環(huán)衛(wèi)清潔班車租賃服務(wù)協(xié)議3篇
- 生產(chǎn)安全事故事件管理知識(shí)培訓(xùn)課件
- 項(xiàng)目施工單位與當(dāng)?shù)卣按迕竦膮f(xié)調(diào)措施
- 藥劑科工作人員的專業(yè)提升計(jì)劃
- 2024-2025學(xué)年度第一學(xué)期二年級(jí)語(yǔ)文寒假作業(yè)第二十一天
- 浙江省寧波市寧??h2023-2024學(xué)年三年級(jí)上學(xué)期語(yǔ)文期末試卷
評(píng)論
0/150
提交評(píng)論