設計模式(Design pattern)是一套被反覆使用、多數人知曉的、通過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的,設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石同樣。項目中合理的運用設計模式能夠完美的解決不少問題,每種模式在如今中都有相應的原理來與之對應,每個模式描述了一個在咱們周圍不斷重複發生的問題,以及該問題的核心解決方案,這也是它能被普遍應用的緣由。算法
整體來講設計模式分爲三大類:設計模式
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。數據結構
結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。併發
行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。ui
其實還有兩類:併發型模式和線程池模式。用一個圖片來總體描述一下:線程
單一職責原則(SRP):任何一個對象都應給只有一個單獨的職責(「低耦合,高內聚」)
里氏替換原則(LSP):在任何父類出現的地方均可以用子類替換
依賴注入原則(DIP):要依賴於抽象而不是依賴於具體實現(此原則是開閉原則的基礎)
接口分離原則(ISP):不該該強迫他們的客戶程序依賴他們不須要的方法
迪米特原則(LOD):一個對象應該對其餘對象儘量少的瞭解,意思就是下降各個對象之間的耦合。
開閉原則(OCP):一個對對象對擴展是開放的,對修改是關閉的。
設計
工廠模式(Factory Pattern):在工廠模式中,客戶類與工廠來是分開的,消費者任什麼時候候須要產品只須要向工廠請求就好,消費者無需修改就能夠接納新產品。缺點是:當前產品修改是工廠也須要修改。建造模式(Builder Pattern):將產品的內部表象和產品的生成過程分割開來,從而使一個建造過程生成具備不一樣表象的產品,建造模式使得產品內部表象能夠獨立的變化,客戶沒必要知道產品的內部細節。建造模式能夠強制實行一種分步驟的建造過程。
工廠方法模式(Abstract Factory Pattern):在工廠方法模式中,核心工廠類再也不負責全部的產品的建立,而是將具體建立工做交給子類處理,成爲一個抽象角色,僅負責給出具體工廠必須實現的接口,而不接觸某款產品的實例化細節。
原型模型模式(Prototype Pattern):原型模型是經過給定一個原型對象來指明要建立的的對象類型,能夠用複製這個對象的方法建立更多的對象,原型模型容許動態的增長或減小產品類。缺點是:每個類必須配備一個克隆方法。
單例模式(Singleton Pattern):確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例單例模式。
適配器模式(Adapter Pattern):把我一個類的接口變化成客戶端指望的另外一個接口。
橋接模式(Bridge Pattern):將抽象化和實現化脫耦,使得兩者能夠獨立變化,也就是說,將他們的強關聯變成弱關聯,即軟件系統使用的是組合/聚合關係而不是繼承關係,從而使二者能夠獨立變化。
合成模式(Composite Pattern):將對象組合成樹形結構以表示「部分-總體」的層次結構,使得用戶對單個對象和組合對象的使用具備一致性
裝飾者模式(Decorator Pattern):裝飾者模式以客戶端透明的方式擴展對象的功能,是繼承方案的一個替代方案,提供了比繼承更多的靈活性,動態的的給一個對象添加功能,這些功能又能夠動態的撤銷。可增長又一些基本功能排列組合產生很是強大的功能。
門面模式(Facade Pattern):外部與一個子系統通訊必須經過一個門面對象進行,門面模式提供一個高層次的接口,使得子系統更容易使用。每個子系統只有一個門面類,並且此門面類只有一個實例,單整個系統能夠有多個門面類。
享元模式(Flyweight Pattern):使用共享對象可有效地支持大量的細粒度對象。
代理模式(Proxy pattern):給某一個對象建立一個代理對象,並由代理對象控制源對象的應用。
責任鏈模式(chain of responsinbleity Pattern):使多個對象有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關係 。將這些對象連成一個鏈,並沿着這條鏈傳遞請求,知道有對象處理它爲止
命令模式(cmd Pattern):將一個請求封裝成一個對象,從而讓你使用不一樣的請求把客戶端參數化,對請求排隊或者記錄請求日誌,能夠提供命令的撤銷和恢復功能。
解釋器模式(Interpreter Pattern):給定一門語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。
迭代子模式(Iterator Pattern):它提供一種方法訪問一個容器對象中各個元素,而又不須要暴露該對象的內部細節。
調停者模式(mediator Pattern ):調停者模式包裝了一系列對象相互做用的方式,使得這些對象沒必要相互明顯做用。從而使他們能夠鬆散偶合。當某些對象之間的做用發生改變時,不會當即影響其餘的一些對象之間的做用。保證這些做用能夠彼此獨立的變化。調停者模式將多對多的相互做用轉化爲一對多的相互做用。調停者模式將對象的行爲和協做抽象化,把對象在小尺度的行爲上與其餘對象的相互做用分開處理。
備忘錄模式(Memento Pattern):在不破壞封裝的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態,這樣之後就可將該對象恢復到原來保存的狀態。
觀察者模式(Observer Pattern):定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴於它的對象都會獲得通知並被自動更新
狀態模式(state Pattern ):當一個對象在狀態改變時容許其改變行爲,這個對象看起來像改變了其類。
策略模式(Strategy Pattern):定義一組算法,將每一個算法都封裝起來,而且使他們之間能夠互換
模板方法模式(Template Method Pattern):
訪問者模式(Visitor Pattern):封裝一些做用於某種數據結構中的各類元素,它能夠在不改變數據結構的前提下定義做用於這些元素的新的操做代理