創(chuàng)建型模式:
抽象工廠模式:提供一個創(chuàng)建一系列或相關依賴對象的接口催束,而無需指定它們具體的類梆暮。
建造者模式:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示。
工廠方法模式:定義一個用于創(chuàng)建對象的接口,讓子類決定實例化哪一個類麻昼,工廠模式使一個類的實例化延遲到其子類。
簡單工廠模式:在工廠類中使用switch或者if……else判斷生產(chǎn)具體的產(chǎn)品馋辈,可以利用反射技術替換switch抚芦。
原型模式:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象。
單例模式:保證一個類僅有一個實例燕垃,并提供全局訪問的方法枢劝。關鍵點是類自身負責自己的實例化,構造方法私有卜壕。多線程訪問實例方法時,需要雙重鎖定烙常,即先進來看有沒有實例轴捎,若有則直接返回,若沒有蚕脏,需要加鎖侦副,若此時多個線程同時進入判斷中,則有可能需要在鎖代碼塊里再次判斷是否已經(jīng)實例化驼鞭。餓漢式秦驯,類變量聲明為靜態(tài)的在系統(tǒng)啟動時即進行實例化,這種方式需要占用系統(tǒng)資源挣棕。懶漢式译隘,需要編程控制實例的創(chuàng)建獲取。
結構型模式:
適配器模式:分為類適配器模式和對象適配器模式洛心。類適配器模式通過多重繼承實現(xiàn)固耘,多種語言不支持。主要是對象適配器模式词身。一個對象方法與需要定義的方法功能類似厅目,方法結構不同,采取適配器模式在適配器中設計與需要定義方法結構一致的方法法严,在方法中調用這個對象方法损敷。一般是適配第三方接口或者后期維護不方便重構代碼。
橋接模式(Bridge):將抽象部分與它的實現(xiàn)部分分離深啤,使它們都可以獨立地變化拗馒。
組合模式:需求體現(xiàn)整體與部分的層次,但是客戶端忽略這種關系墓塌,使用每一個對象時可以統(tǒng)一使用瘟忱。透明方式與安全方式,透明方式需要顯式聲明所有方法苫幢,安全模式不聲明有區(qū)別的方法访诱,需要客戶端判斷類型。
裝飾模式:動態(tài)地給一個對象添加一些額外的指責韩肝。就增加功能來說触菜,裝飾模式相比生成子類更加靈活。
外觀模式:為子系統(tǒng)中的一組接口提供一個一致的界面哀峻,外觀模式定義了一個高層接口涡相,這個接口使得這一子系統(tǒng)更加容易使用哲泊。
享元模式:運用共享技術有效支持大量細粒度的對象。將細粒度不同的數(shù)據(jù)轉移到實例之外保存催蝗,方法調用時切威,傳遞進來,通過共享大幅度減少單個實例個數(shù)丙号。
代理模式:為其它對象提供一種代理以控制對這個對象的訪問先朦。
行為型模式:
觀察者模式:定義對象間的一種一對多的依賴關系,當一個對象的狀態(tài)發(fā)生改變時犬缨,所有依賴于它的對象都得到通知并被自動更新喳魏。
模板模式:定義一個操作的算法骨架,而將一些步奏延遲到子類中怀薛,模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟刺彩。
命令模式:將一個請求封裝為一個對象,從而可對請求參數(shù)化枝恋,對請求排隊或者記錄日志创倔,以及支持可撤銷操作。
狀態(tài)模式:對于對象狀態(tài)的判斷邏輯太過復雜鼓择,將邏輯轉移到不同狀態(tài)的一系列類中三幻。
職責鏈模式:使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接受者之間的耦合關系呐能。將這個對象連成一條鏈念搬,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止摆出。
解釋器模式:給定一個語言朗徊,定義它的文法的一種表示,并定義一個解釋器偎漫,這個解釋器使用該表示來解釋語言中的句子爷恳。
中介者模式:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用象踊,從而使其耦合松散温亲,而且可以獨立地改變它們之間的交互。
訪問者模式(Visitor):表示一個作用于某對象結構中的各元素的操作杯矩。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作栈虚。
策略模式:定義一系列的算法,把它們一個個封裝起來史隆,并且使它們可相互替換魂务。本模式使得算法可獨立于使用它的客戶而變化。
備忘錄模式:在不破壞封裝的前提下,捕獲對象的內(nèi)部狀態(tài)粘姜,并在該對象之外保存鬓照,以便回復對象原有狀態(tài)。
迭代器模式:當有多種遍歷需要時孤紧,分離了集合對象的遍歷行為豺裆,抽象出一個迭代器,既可以不暴露集合結構坛芽,又可以訪問集合對象內(nèi)部數(shù)據(jù)留储。
開放-封閉原則:程序設計,對于更改時閉合的咙轩,對于擴展是開放的。
依賴倒轉原則:高層模塊不應該依賴底層模塊阴颖,二者都應該依賴抽象活喊。抽象不應該依賴細節(jié),細節(jié)應該依賴抽象量愧。面向接口編程钾菊。
單一指責原則:對象不應該承擔太多功能。引起對象變化的原因應該只有一種偎肃。
接口隔離原則:客戶端不應該依賴它不需要的接口煞烫,類間的依賴關系應該建立在最小的接口上。
李氏代換原則:子類應該可以替換父類并出現(xiàn)再父類能夠出現(xiàn)的地方累颂。
迪米特原則:最少知識原則滞详。如果兩個軟件實體無需直接通信,那么久不應當發(fā)生直接的相互調用紊馏,可以通過第三方轉發(fā)該調用料饥,使類之間的耦合度降低,提高模塊的相對獨立性朱监。
合成/聚合復用原則:盡量使用合成/聚合替換繼承岸啡。
敏捷開發(fā)原則:不要為代碼添加基于猜測的、實際不需要的功能赫编。
內(nèi)聚性與耦合性:內(nèi)聚性描述是一個例程內(nèi)部組成部分之間相互聯(lián)系的緊密程度巡蘸。耦合性描述的是一個例程與其他例程之間聯(lián)系的緊密程度。軟件開發(fā)的目標應該是創(chuàng)建這樣的例程:內(nèi)部完整擂送,也就是高內(nèi)聚悦荒,而與其他例程之間的聯(lián)系則是小巧、直接团甲、課件逾冬、靈活的,這就是松耦合(DPE)。