1、設(shè)計(jì)模式
設(shè)計(jì)模式是一套被反復(fù)使用,多數(shù)人知曉的,經(jīng)過(guò)分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式的目的是為了代碼重用,避免程序大量修改,同時(shí)是代碼更容易被他人理解,并且保證代碼的可靠性。設(shè)計(jì)模式對(duì)自己,他人,系統(tǒng)都是有益的,設(shè)計(jì)模式使得代碼編制真正的工程化,可以說(shuō)設(shè)計(jì)模式是軟件設(shè)計(jì)的基石。
常見(jiàn)的設(shè)計(jì)模式有:工廠模式,單例模式,適配器模式,享元模式以及觀察者模式。
2、單例模式
在某些情況下,有些對(duì)象只需要一個(gè)就可以了,即每個(gè)類只需要一個(gè)實(shí)例。例如,一臺(tái)計(jì)算機(jī)上有多臺(tái)打印機(jī),但是這個(gè)計(jì)算機(jī)上打印程序只能有一個(gè),這就需要單例模式兩個(gè)打印作業(yè)同時(shí)輸出到打印機(jī)中。
簡(jiǎn)單來(lái)說(shuō)單例模式(單件模式)的作用就是保證整個(gè)程序的生命周期中,任何時(shí)刻,單例的實(shí)例都只存在一個(gè)(也可以不存在)。單例模式確保一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例單例模式。單例模式只有在真正的“單一實(shí)例”的需求時(shí)才可使用。
需要區(qū)分一下全局變量和單例模式。首先,全局變量是一個(gè)對(duì)象的靜態(tài)引用,全局變量的確可以提供單例模式全局訪問(wèn)的功能,但是,它并不能保證應(yīng)用程序只有一個(gè)實(shí)例。同時(shí),在編碼規(guī)范中,也明確指出要少使用全局變量以增加程序的可讀性,還有就是全局變量不能實(shí)現(xiàn)繼承(雖然單例模式在繼承上不能很好地處理,但是還是可以實(shí)現(xiàn)繼承的)。單例模式的話,其在類中保存了唯一的實(shí)例,單例模式的構(gòu)造函數(shù)必須為私有,同時(shí)提供一個(gè)全局訪問(wèn)點(diǎn)。
3、工廠模式
工廠模式是專門(mén)負(fù)責(zé)實(shí)例化大量公共接口的類,工廠模式可以動(dòng)態(tài)決定將哪一個(gè)類實(shí)例化,而不是事先知道每次要實(shí)例化哪個(gè)類??蛻纛惡凸S類是分開(kāi)的。消費(fèi)者無(wú)論什么時(shí)候需要某種產(chǎn)品,需要做的只是向工廠提出請(qǐng)求即可。消費(fèi)者無(wú)需修改就可以接納新產(chǎn)品。當(dāng)然,也存在缺點(diǎn),當(dāng)產(chǎn)品修改時(shí),工廠類也需要作出修改。
工廠模式包含以下幾種形態(tài):
1)簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式的工廠類是根據(jù)提供給它的參數(shù),返回幾個(gè)可能產(chǎn)品的一個(gè)類的實(shí)例,通常情況下,通常它返回的類都有一個(gè)公共父類和公共方法。2)工廠方法模式
工廠方法模式是類的創(chuàng)建模式,其用意是定義一個(gè)用于創(chuàng)建產(chǎn)品對(duì)象的工廠接口,而將實(shí)際創(chuàng)建工作推遲到工廠接口的子類中。它屬于簡(jiǎn)單工廠模式的進(jìn)一步抽象和推廣。多態(tài)的使用,使得工廠方法模式保持了簡(jiǎn)單工廠模式的優(yōu)點(diǎn)。3)抽象工廠模式
抽象工廠模式是所有形態(tài)的工廠模式中最為抽象和具有一般性的一種形態(tài)。抽象工廠模式是指當(dāng)有多個(gè)抽象角色同時(shí)使用一種工廠模式,抽象工廠模式可以向客戶端提供一個(gè)接口,使客戶端在不必指定產(chǎn)品的具體情況下,創(chuàng)建多個(gè)產(chǎn)品對(duì)象。根據(jù)LSP原則,任何接受父類的地方,都應(yīng)能接受子類。工廠類負(fù)責(zé)創(chuàng)建抽象產(chǎn)品的具體子類的實(shí)例。
4、適配器模式
適配器模式也稱為變壓器模式,它是一個(gè)類的接口轉(zhuǎn)化成為客戶端所期待的另一種接口,從而使原本接口不匹配而無(wú)法一起工作的兩個(gè)類能夠在一起工作。適配類可以根據(jù)所傳遞的參數(shù)返回一個(gè)適合的實(shí)例給客戶端。
適配器模式主要應(yīng)用于“希望復(fù)用一些現(xiàn)存的類,但是接口又與復(fù)用環(huán)境不一致的情況”,在遺留代碼復(fù)用、類庫(kù)遷移等方面非常有用。同時(shí)適配器模式也有對(duì)象適配器和類適配器兩種形式的實(shí)現(xiàn)結(jié)構(gòu),類適配器采用“多繼承”的實(shí)現(xiàn)方式,會(huì)引起高耦合度,所以一般不推薦使用,對(duì)象適配器采用“對(duì)象組合”的方式,耦合度低,應(yīng)用范圍更廣。
例如,現(xiàn)在系統(tǒng)已經(jīng)實(shí)現(xiàn)了點(diǎn),線,正方形,現(xiàn)在客戶需要實(shí)現(xiàn)一個(gè)圓形,一般做法是建立一個(gè)Circle類繼承shape類,然后去實(shí)現(xiàn)對(duì)應(yīng)的display,fill,undisplay等方法。此時(shí),發(fā)現(xiàn)其他項(xiàng)目組已經(jīng)實(shí)現(xiàn)了一個(gè)畫(huà)圓的類,但是他的方法方法名卻不同,displayll,fillhh,undisplayhh,我們不能直接復(fù)用,因?yàn)闊o(wú)法保證多態(tài),此時(shí)可以采用適配器模式。
5、享元模式
享元模式以共享的方式高效地支持大量的細(xì)粒度對(duì)象。享元模式能做到的關(guān)鍵是區(qū)分內(nèi)蘊(yùn)和外蘊(yùn)、內(nèi)蘊(yùn)狀態(tài)是存儲(chǔ)在享元內(nèi)部,不會(huì)隨環(huán)境改變而改變的部分。外蘊(yùn)狀態(tài)隨環(huán)境而變化。外蘊(yùn)狀態(tài)不影響內(nèi)蘊(yùn),兩者是相互獨(dú)立的。將可以共享的狀態(tài)和不可共享的狀態(tài)從常規(guī)類中區(qū)分開(kāi),將不可共享的狀態(tài)從類中剔除??蛻舳瞬豢芍苯觿?chuàng)建被共享的狀態(tài),而應(yīng)當(dāng)使用一個(gè)工廠對(duì)象創(chuàng)建被共享的對(duì)象。享元模式可以大幅度降低內(nèi)存中對(duì)象的數(shù)量。
6、觀察者模式
觀察者模式(發(fā)布/訂閱模式)提供了避免組件之間緊密耦合的另一種方法,它將觀察者與被觀察者分開(kāi)。在該模式中,一個(gè)對(duì)象通過(guò)添加一個(gè)方法(該方法允許另一個(gè)被稱為觀察者的對(duì)象注視自己)使本身變得可觀察。當(dāng)可觀察的對(duì)象更改時(shí),它將消息傳送到自己注冊(cè)的觀察者。這些觀察者使用該信息執(zhí)行的操作可與觀察者對(duì)象無(wú)關(guān)。
例如,用戶界面可與作為一個(gè)觀察者,業(yè)務(wù)數(shù)據(jù)是被觀察者,用戶界面觀察業(yè)務(wù)數(shù)據(jù)的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界面上。面向?qū)ο笤O(shè)計(jì)的原則是:系統(tǒng)中的每個(gè)類重點(diǎn)放在某一個(gè)功能上,而不是兼顧所有。一個(gè)對(duì)象只做一件事,并將它做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維護(hù)性和可重用性。