前言:關於設計模式,在框架中用的比較多。在日常接觸最爲頻繁的估計是單例模式了,所以筆者在此對設計模式相關知識點進行總結。html
1.設計模式的種類
整體來講,設計模式分爲3大類總共23種:算法
1)建立型模式,共5種設計模式
工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。app
2)結構型模式,共7種框架
適配器模式、裝飾器模式、外觀模式、橋接模式、組合模式、享元模式。ui
3)行爲型模式,共11種url
策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。spa
上述23種設計模式都是創建在面向對象的基礎上,所以沒有常見的生產者/消費者模式(面向過程)。.net
參考:設計
http://www.cnblogs.com/xrq730/p/4896125.html
http://blog.chinaunix.net/uid-29140694-id-4107880.html
2.簡單工廠模式
簡單工廠模式的通俗理解:在一個鍵盤上,敲下‘K’鍵,對應生成‘K’的對象,依次類推。至關於一個有按鈕的黑盒子,須要什麼,直接按下對應的按鈕便可。
簡單工廠模式由一個工廠對象決定生產出哪種產品類的實例。
參考:
http://www.cnblogs.com/xrq730/p/4902597.html
3.工廠方法模式
工廠方法模式是對簡單工廠模式的進一步抽象,它將實際建立的動做交給子類。
使用工廠方法模式的系統涉及到如下角色:
1)抽象工廠角色
擔任這個角色的是工廠方法模式的核心,任何在模式中建立對象的工廠類必須實現這個接口。
注:總的工廠接口,讓具體工廠角色進行實現
2)具體工廠角色
擔任這個角色的是實現了工廠接口的具體Java類,具體工廠角色與業務密切相關,而且隨着使用者的調用以建立導出類。
注:具體實現類,實現總的工廠接口,內部進行具體類的實現
3)抽象產品角色
工廠方法模式所建立的對象的超類。
注:具體動做接口,聲明在總工廠接口中
4)具體產品角色
這個角色實現了抽象導出角色所聲明的接口,工廠方法模式所建立的每個對象都是某個具體角色導出角色的實例。
注:實現抽象導出角色,用於工廠子類的具體實現
注:圖片來源於百度百科:工廠方法模式
從圖中能夠清晰的知道:Creator=>抽象工廠角色;BulbCreator和TubeCreator=>具體工廠角色;Light=>抽象產品角色;BulbLight和TubeLight=>具體產品角色。
參考:
http://www.cnblogs.com/xrq730/p/4905578.html
http://www.cnblogs.com/ytaozhao/p/3389883.html
4.抽象工廠模式
抽象工廠就是對一組具備相同主題的工廠進行封裝。
優勢:
1)抽象工廠模式隔離了具體類的生產,使得客戶並不須要知道什麼被建立。
2)當一個產品族中的多個對象被設計成一塊兒工做時,它能保證客戶端始終只使用同一個產品族中的對象。
3)增長新的具體工廠和產品族很方便,無須修改已有系統,符合「開閉原則」。
缺點:
增長新的產品等級結構很複雜,須要修改抽象工廠和全部的具體工廠類,對「開閉原則」的支持呈現傾斜性。
參考:
https://www.cnblogs.com/chenpi/p/5156801.html
http://www.cnblogs.com/ytaozhao/p/3392149.html
5.策略模式
策略模式我的理解就是將不一樣的策略經過不一樣的子類實現進行封裝,在調用時,需明確具體使用的具體策略,而後進行不一樣行爲的反應。
策略模式是對算法的包裝,是把使用算法的責任和算法自己分開。策略模式一般是把一系列的算法包裝到一系列的策略類裏面,做爲一個抽象策略類的子類。
策略模式涉及到三個角色:
1)環境角色
持有一個策略Strategy的引用。
2)抽象策略角色
這是一個抽象角色,一般由一個接口或抽象類實現,此角色給出全部具體策略類所需的接口。
3)具體策略角色
包裝了相關算法或行爲。
參考:
http://www.cnblogs.com/xrq730/p/4906313.html
6.適配器模式
適配器模式:能夠把一個類的接口變換成客戶端所期待的另外一種接口,使得本來因接口不匹配而沒法在一塊兒工做的兩個類能夠一塊兒工做。
通俗理解:適配器模式就至關於一箇中間件,加上一層轉換後,就能夠正常工做了。
適配器分類適配器和對象適配器。
適配器模式的優缺點
優勢
1)有更好的複用性。系統須要使用現有的類,但此類接口不符合系統須要,經過適配器模式讓這些功能獲得很好的複用。
2)有更好的擴展性。實現適配器,能夠調用本身開發的功能。
缺點
過多使用適配器會使得系統很是凌亂,明明調用的是A接口,內部卻被適配成了B接口。所以除非必要,不推薦使用適配器,而是直接對系統重構。
參考:
http://www.cnblogs.com/xrq730/p/4906487.html
7.迭代器模式
迭代器模式又叫作遊標(Cursor)模式,其做用是提供一種方法訪問一個容器元素中的各個對象,而又不暴露該對象的內部細節。
參考:
http://www.cnblogs.com/xrq730/p/4907184.html
8.代理模式
代理模式的定義:給某一對象提供一個代理對象,並由代理對象控制對原對象的引用。
通俗理解:房東經過中介進行賣房,中介就至關於一個代理。
代理模式分靜態代理和動態代理兩種。
參考:
http://www.cnblogs.com/xrq730/p/4907999.html
9.觀察者模式
觀察者模式也叫做發佈-訂閱模式,也就是事件監聽機制。觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象,這個主題對象在狀態上發生變化時,會通知全部觀察者對象,使他們可以自動更新本身。
觀察者模式所涉及的角色有:
1)抽象主題角色
抽象主題角色把全部對觀察者對象的引用保存在一個集合中,每一個主題均可以有任意數量的觀察者。抽象主題提供一個接口,能夠增長和刪除觀察者對象,並具備通知觀察者的功能。
2)具體主題角色
將有關狀態存入具體觀察者對象,在具體主題的內部狀態改變時,給全部登記過的觀察者發出通知。
3)抽象觀察者角色
爲全部的具體觀察者提供一個接口,在獲得主題通知時更新本身
4)具體觀察者角色
存儲與主題的狀態相關的狀態。具體觀察者角色實現抽象觀察者角色所要求的更新接口,以便使自己的狀態與主題的狀態協調
參考:
http://www.cnblogs.com/xrq730/p/4908686.html
10.外觀模式
外觀模式是對象的結構模式,外部與一個子系統的通訊必須經過一個統一的外觀對象進行。
通俗理解外觀模式就是:好比到超市買東西,原來都是本身去找,而後付錢。如今經過一箇中間人,全程代替我買東西,而後把東西交給我便可。
外觀模式涉及的角色:
1)外觀角色
客戶端調用這個角色的方法。此角色知曉相關的子系統的功能和責任,正常狀況下,本角色會將全部從客戶端發來的請求委派到響應的子系統中。
2)子系統角色
能夠同時有一個或多個子系統,每一個子系統都不是一個單獨的類,而是一個類的集合。每一個子系統均可以被客戶端直接調用,或者被外觀角色直接調用。子系統並不知道外觀角色的存在,對於子系統而言,外觀僅僅是另一個客戶端而已。
參觀:
http://www.cnblogs.com/xrq730/p/4908822.html
11.裝飾器模式
裝飾器模式又稱爲包裝(Wrapper)模式。裝飾器模式以多客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案。
裝飾器模式的通俗理解:好比一面牆,將它進行裝修,加上掛鉤、燈等東西,使其功能更增強大。
裝飾器模式中的角色有:
1)抽象構件角色
給出一個抽象接口,以規範準備接受附加責任的對象。
2)具體構件角色
定義一個將要接受附加責任的類。
3)裝飾角色
持有一個構建對象的實例,並定義一個與抽象構件接口一致的接口。
4)具體裝飾角色
負責給構建對象貼上附加的責任。
參考: