23種設計模式

概述

設計模式代表了最佳的實踐,通常被有經驗的面向對象的軟件開發(fā)人員所采用。設計模式是軟件開發(fā)人員針對某一類問題的最優(yōu)解決方案,是從許多優(yōu)秀的軟件系統(tǒng)中總結出來的。

使用設計模式的目的:為了提高代碼的可重用性钝鸽、讓代碼更容易被他人理解、保證代碼可靠性庞钢,讓代碼編寫更加工程化拔恰。

Java中設計模式通常有23種。

1.大致可分為3類:創(chuàng)建型基括、行為型和結構型颜懊。

設計模式的六大原則

2.開閉原則

開閉原則的意思是:對擴展開放,對修改關閉。在程序需要進行拓展的時候河爹,不能去修改原有的代碼匠璧,實現一個熱插拔的效果。簡言之咸这,是為了使程序的擴展性好夷恍,易于維護和升級。想要達到這樣的效果媳维,我們需要使用接口和抽象類

3.里氏轉換原則

里氏代換原則是面向對象設計的基本原則之一酿雪。里氏代換原則中說,任何基類可以出現的地方侄刽,子類一定可以出現指黎。LSP 是繼承復用的基石,只有當派生類可以替換掉基類唠梨,且軟件單位的功能不受到影響時袋励,基類才能真正被復用侥啤,而派生類也能夠在基類的基礎上增加新的行為当叭。里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化盖灸,而基類與子類的繼承關系就是抽象化的具體實現蚁鳖,所以里氏代換原則是對實現抽象化的具體步驟的規(guī)范。

依賴倒轉原則

這個原則是開閉原則的基礎赁炎,具體內容:針對接口編程醉箕,依賴于抽象而不依賴于具體

4. 接口隔離原則

這個原則的意思是:使用多個隔離的接口,比使用單個接口要好徙垫。它還有另外一個意思是:降低類之間的耦合度讥裤。由此可見,其實設計模式就是從大型軟件架構出發(fā)姻报、便于升級和維護的軟件設計思想己英,它強調降低依賴,降低耦合吴旋。

5.迪米特法則损肛,又稱最少知道原則

最少知道原則是指:一個實體應當盡量少地與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立荣瑟。

6. 合成復用原則

合成復用原則是指:盡量使用合成/聚合的方式治拿,而不是使用繼承。

創(chuàng)建型模式

創(chuàng)建型模式設計對象的實例化笆焰,特點是不讓用戶代碼依賴于對象的創(chuàng)建或排列方式劫谅,避免用戶直接用new創(chuàng)建對象。

創(chuàng)建型模式有5種。

工廠模式同波、抽象工廠模式鳄梅、建造者模式、原型模式和單列模式

工廠模式

工廠模式是java中最常見的設計模式之一未檩,它提供了一種創(chuàng)建對象的最佳方式戴尸。在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯冤狡,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象孙蒙。

目的:定義一個創(chuàng)建對象的接口,讓子類自己去決定實例化那個產品類悲雳,也就是子類去實現接口

注意事項:

作為一種創(chuàng)建類模式挎峦,在任何需要生成復雜對象的地方,都可以使用工廠方法模式合瓢。有一點需要注意的地方就是復雜對象適合使用工廠模式坦胶,而簡單對象,特別是只需要通過 new 就可以完成創(chuàng)建的對象晴楔,無需使用工廠模式顿苇。如果使用工廠模式,就需要引入一個工廠類税弃,會增加系統(tǒng)的復雜度纪岁。

抽象工廠模式

抽象工廠模式(Abstract

Factory Pattern)是圍繞一個超級工廠創(chuàng)建其他工廠。該超級工廠又稱為其他工廠的工廠则果。這種類型的設計模式屬于創(chuàng)建型模式幔翰,它提供了一種創(chuàng)建對象的最佳方式。

在抽象工廠模式中西壮,接口是負責創(chuàng)建一個相關對象的工廠遗增,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象款青。

意圖:提供一個創(chuàng)建一系列相關或相互依賴對象的接口做修,而無需指定它們具體的類。

兩種設計模式主要的區(qū)別在于產品可都,工廠模式是用來創(chuàng)建同一個產品的不同類型的缓待,而抽象工廠模式是用來創(chuàng)建不同類的產品。一般來說渠牲,產品種類單一旋炒,適合用工廠模式;如果有多個签杈;多種類型時瘫镇,通過抽象工廠模式來創(chuàng)建時很合適的鼎兽。

單例模式

單例模式是Java最簡單的設計模式,這種設計模式屬于創(chuàng)建型模式铣除,它提供了一種創(chuàng)建對象的最佳方式谚咬。

這種設計模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象同時確保只有單個對象被創(chuàng)建尚粘。這個類提供了一種訪問其唯一的對象的方式择卦,可以直接訪問,不需要實例化該類的對象郎嫁。

注意:

單例類只能有一個實例秉继。

單例類必須自己創(chuàng)建自己的唯一實例

單例類必須給所有其他對象提供這一實例關鍵代碼:構造函數是私有的。

建造者模式

建造者模式使用多個簡單的對象一步步構建成復雜的對象泽铛。這種類型的設計模式屬于創(chuàng)建型設計模式尚辑,它提供了一種創(chuàng)建對象的最佳方式。

一個Builder類會一步一步構造最終的對象盔腔。該Builder類是獨立于其他對象的杠茬。

原型模式

原型模式是用于創(chuàng)建重復的對象,同時又能保證性能弛随。這種類型的設計模式屬于創(chuàng)建型模式瓢喉,它提供了一種創(chuàng)建對象的最佳方式。

這種設計模式是實現了一個原型接口撵幽,該接口用于創(chuàng)建當前對象的克隆灯荧。當直接創(chuàng)建對象的代價比較大時礁击,則采用這種模式盐杂。

意圖:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象哆窿。

關鍵代碼:實現cloneable接口链烈,重寫clone()方法。當通過new產生一個對象需要非常繁瑣的數據準備或訪問權限挚躯,或者類初始化消耗非常多的資源强衡,這個資源包括數據、硬件資源時码荔′銮冢可以使用原型模式

裝飾者模式

裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構缩搅。這種類型的設計模式屬于結構型模式越败,它是作為現有的類的一個包裝。

這種模式創(chuàng)建了一個裝飾類硼瓣,用來包裝原有的類究飞,并在保持類方法簽名完整性的前提下,提供了額外的功能。

意圖:動態(tài)地給一個對象添加一些額外的職責亿傅。就增加功能來說媒峡,裝飾器模式相比生成子類更為靈活。

主要解決:一般的葵擎,我們?yōu)榱藬U展一個類經常使用繼承方式實現谅阿,由于繼承為類引入靜態(tài)特征,并且隨著擴展功能的增多酬滤,子類會很膨脹奔穿。

何時使用:在不想增加很多子類的情況下擴展類。

舉例

裝飾模式:以對客戶端透明的方式擴展對象的功能敏晤,是繼承關系的一個替代方案贱田;代理模式:給一個對象提供一個代理對象,并有代理對象來控制對原有對象的引用嘴脾;

裝飾模式應該為所裝飾的對象增強功能男摧;代理模式對代理的對象施加控制,并不提供對象本身的增強功能

裝飾者模式的定義:動態(tài)的將責任附加到被裝飾者對象上译打,用于擴展對象的功能耗拓。比繼承的靈活性大。典型的如Java IO的設計即是裝飾者模式的典型應用奏司∏茄  代理模式模式的定義:對其他對象進行代理,以控制對被代理對象的訪問韵洋。Spring的為業(yè)務邏輯層方法生成的代理類竿刁,主要進行一些事務控制等。由定義可以看出裝飾的責任是擴展功能 搪缨,而代理主要控制訪問食拜。

動態(tài)代理技術:動態(tài)代理技術就是用來產生一個對象的代理對象。

代理對象的價值:

1.代理對象存在的價值主要用于攔截對真實業(yè)務對象的訪問副编。2.代理對象應該具有和目標對象(真實業(yè)務對象)相同的方法负甸。

Java中的代理:java.lang.reflect.Proxy類

要生成某一個對象的代理對象,這個代理對象通常也要編寫一個類來生成痹届,java在JDK1.5之后提供了一個"java.lang.reflect.Proxy"類呻待,通過"Proxy"類提供的一個newProxyInstance方法用來創(chuàng)建一個對象的代理對象。

newProxyInstance方法用來返回一個代理對象队腐,這個方法總共有3個參數蚕捉,ClassLoader loader用來指明生成代理對象使用哪個類裝載器,Class<?>[]

interfaces用來指明生成哪個對象的代理對象香到,通過接口指定鱼冀,InvocationHandler h用來指明產生的這個代理對象要做什么事情


注意:在java中規(guī)定报破,要想產生一個對象的代理對象,那么這個對象必須要有一個接口

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末千绪,一起剝皮案震驚了整個濱河市充易,隨后出現的幾起案子,更是在濱河造成了極大的恐慌荸型,老刑警劉巖盹靴,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異瑞妇,居然都是意外死亡稿静,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門辕狰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改备,“玉大人,你說我怎么就攤上這事蔓倍⌒” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵偶翅,是天一觀的道長默勾。 經常有香客問我,道長聚谁,這世上最難降的妖魔是什么母剥? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮形导,結果婚禮上环疼,老公的妹妹穿的比我還像新娘。我一直安慰自己骤宣,他們只是感情好秦爆,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布序愚。 她就那樣靜靜地躺著憔披,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爸吮。 梳的紋絲不亂的頭發(fā)上芬膝,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音形娇,去河邊找鬼锰霜。 笑死,一個胖子當著我的面吹牛桐早,可吹牛的內容都是我干的癣缅。 我是一名探鬼主播厨剪,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼友存!你這毒婦竟也來了祷膳?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤屡立,失蹤者是張志新(化名)和其女友劉穎直晨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體膨俐,經...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡勇皇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了焚刺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敛摘。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乳愉,靈堂內的尸體忽然破棺而出着撩,到底是詐尸還是另有隱情,我是刑警寧澤匾委,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布拖叙,位于F島的核電站,受9級特大地震影響赂乐,放射性物質發(fā)生泄漏薯鳍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一挨措、第九天 我趴在偏房一處隱蔽的房頂上張望挖滤。 院中可真熱鬧,春花似錦浅役、人聲如沸斩松。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惧盹。三九已至,卻和暖如春瞪讼,著一層夾襖步出監(jiān)牢的瞬間钧椰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工符欠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫡霞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓希柿,卻偏偏與公主長得像诊沪,于是被迫代替她去往敵國和親养筒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容