本文所有內容均節選自《設計模式就該這樣學》
本文自2012年10月29日起持續連載,請大家持續關注....
序言
Design Patterns: Elements of Reusable Object-Oriented Software(以下簡稱《設計模式》),一書由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides合著(Addison-Wesley,1995)。這四位作者常被稱為“四人組(Gang of Four)”,而這本書也就被稱為“四人組(或 GoF)”書。他們首次給我們總結出一套軟體開發可以反覆使用的經驗,幫助我們提高程式碼的可重用性、系統的可維護性等,解決軟體開發中的複雜問題。
設計模式已誕生20多年,其間相繼出版的關於設計模式的經典著作不計其數。如果說GoF的《設計模式》是設計模式領域的“聖經”,那麼之後出版的各種關於設計模式的書籍可稱為“聖經”的“批註版”或者“白話版”。本書正是基於GoF的《設計模式》來編寫的。
《設計模式》總結的是經驗之談,千萬不要死記硬背,生搬硬套。下面來總體預覽一下設計模式的分類和總結,如下表所示。
分 類 | 解 釋 | 舉 例 |
---|---|---|
建立型設計模式(Creational) | 這類設計模式提供了一種在建立物件的同時隱藏建立邏輯的方式,而不是使用新的運算子直接例項化物件,這使得程式在判斷針對某個給定例項需要建立哪些物件時更加靈活 | 工廠方法模式(Factory Method Pattern)、抽象工廠模式(Abstract Factory Pattern)、單例模式(Singleton Pattern)、原型模式(Prototype Pattern)、建造者模式(Builder Pattern) |
結構型設計模式(Structural) | 這類設計模式關注類和物件的組合。繼承的概念被用來組合介面和定義組合物件獲得新功能的方式 | 代理模式(Proxy Pattern)、門面模式(Facade Pattern)、裝飾器模式(Decorator Pattern)、享元模式(Flyweight Pattern)、組合模式(Composite Pattern)、介面卡模式(Adapter Pattern)、橋接模式(Bridge Pattern) |
行為型設計模式(Behavioral) | 這類設計模式特別關注物件之間的通訊 | 模板方法模式(Template Method Pattern)、策略模式(Strategy Pattern)、責任鏈模式(Chain of Responsibility Pattern)、迭代器模式(Iterator Pattern)、命令模式(Command Pattern)、狀態模式(State Pattern)、備忘錄模式(Memento Pattern)、中介者模式(Mediator Pattern)、直譯器模式(Interpreter Pattern)、觀察者模式(Observer Pattern)、訪問者模式(Visitor Pattern) |
本文是我對“聖經”實踐的精華總結,全文內容節選自《設計模式就該這樣學》,這是一本可以真正能夠落地的“設計模式”之書,也是目前唯一一本結合框架原始碼如何落地“設計模式”這個角度來理解設計模式的書。本文也將會結合JDK、Spring、MyBatis、Tomcat、Netty等經典框架原始碼展開對設計模式的分析。當然,本文還會結合我多年的“踩坑填坑”經驗和“教學答疑”經驗,用比“聖經”更深刻、更全面、更通俗、更生動、更有趣、更接地氣的方式並且結合真實業務場景分析每種設計模式的優缺點,治癒“設計模式選擇困難症”。選設計模式就像相親選物件,一旦做好了接受TA缺點的準備,那TA就一定屬於你。所以,本文對於日常開發而言更具有指導意義。
Tom彈架構,只彈乾貨不摻水,本文所有分享內容均從實戰角度出發,不談概念,只談實戰和應用落地
1 各種設計模式使用頻率總結
以下是根據本人的個人經驗,對設計模式使用頻率的總結,不可作為學術依據,僅供大家參考。因為設計模式的選擇還是要依賴具體的業務場景的,每個人接觸的業務領域都不一樣,自然設計模式的選擇也會不一樣。
1.1 建立型設計模式
如下圖所示,建立型設計模式中使用頻率由高到低依次為工廠方法模式、抽象工廠模式、建造者模式、單例模式、原型模式。原型模式一般都有現成的工具類,自己造輪子的情況比較少。
1.2 結構型設計模式
如下圖所示,結構型設計模式中使用頻率由高到低依次為介面卡模式、裝飾器模式、代理模式、門面模式、組合模式、享元模式、橋接模式。其中橋接模式一般都有現成的工具類,自己造輪子的情況比較少。
1.3 行為型設計模式
如下圖所示,行為型設計模式中使用頻率由高到低依次為策略模式、觀察者模式、責任鏈模式、直譯器模式、模板方法模式、迭代器模式、中介者模式、命令模式、訪問者模式、備忘錄模式、狀態模式。其中,觀察者模式、直譯器模式、迭代器模式、中介者模式、命令模式、訪問者模式、備忘錄模式一般都有現成的工具類,自己造輪子的情況比較少。
下面根據本人多年研究設計模式的經驗總結,將壓箱乾貨首次全網釋出。如果本文對您有幫助一定要收藏,也歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支援是我堅持創作的動力。關注『 Tom彈架構 』可獲取更多技術乾貨!
2 為什麼一定要學習設計模式
標題 | 備註 |
---|---|
Tom彈架構:為什麼一定要學習設計模式 | 2021/10/29已更新 |
3 七大架構設計原則篇
標題 | 備註 |
---|---|
Tom彈架構:開閉原則(Open-Closed Principle,OCP) | 2021/10/21已更新 |
Tom彈架構:依賴倒置原則(Dependence Inversion Principle,DIP) | 2021/10/22已更新 |
Tom彈架構:單一職責原則(Simple Responsibility Principle,SRP) | 2021/10/23已更新 |
Tom彈架構:介面隔離原則(Interface Segregation Principle,ISP) | 2021/10/24已更新 |
Tom彈架構:迪米特法則(Law of Demeter,LoD) | 2021/10/25已更新 |
Tom彈架構:里氏替換原則(Liskov Substitution Principle,LSP) | 2021/10/26已更新 |
Tom彈架構:合成複用原則(Composite/Aggregate Reuse Principle,CARP) | 2021/10/27已更新 |
目錄僅代表更新計劃,因精力分配原因不一定按順序目錄順序連載,計劃1個月(即2021年11月31日前)連載完畢,請小夥伴們持續關注本文更新,大家可以先關注和收藏本文或者關注『 Tom彈架構 』更新通知,感謝您的支援!
4 建立型設計模式
標題 | 備註 |
---|---|
Tom彈架構:簡單工廠模式(Simple Factory Pattern) >> 徹底說透簡單工廠那些你沒有關注過的細節 | 2021/11/10已更新 |
Tom彈架構:工廠方法模式(Factory Method Pattern)>> 全面通透深入剖析工廠方法模式 | 2021/11/11已更新 |
Tom彈架構:抽象工廠模式(Abstract Factory Pattern)>> 手寫資料庫連線池,讓抽象工廠不再抽象 | 2021/11/12已更新 |
Tom彈架構:單例模式(Singleton Pattern)>> 這9個單例被破壞的事故現場,你遇到過幾個? | 2021/10/26已更新 |
Tom彈架構:原型模式(Prototype Pattern)>> 一文讀懂深克隆與淺克隆的關係 | 2021/11/02已更新 |
Tom彈架構:建造者模式(Builder Pattern)>> 用建造者模式實現一個防SQL隱碼攻擊的ORM框架 | 2021/10/26已更新 |
5 結構型設計模式
標題 | 備註 |
---|---|
Tom彈架構:代理模式(Proxy Pattern)>> 從沒有人將代理模式分析得如此透徹 | 2021/10/27已更新 |
Tom彈架構:門面模式(Facade Pattern)>> 原來你不知道自己每天都在用門面模式 | 2021/11/13已更新 |
Tom彈架構:裝飾器模式(Decorator Pattern)>> 趣談裝飾器模式,讓你一輩子不會忘 | 2021/11/01已更新 |
Tom彈架構:享元模式(Flyweight Pattern)>> 就因為把int改成Integer,第2天被辭了 | 2021/11/01已更新 |
Tom彈架構:組合模式(Composite Pattern)>> 沒有效能瓶頸的無限級選單樹應該這樣設計 | 2021/11/04已更新 |
Tom彈架構:介面卡模式(Adapter Pattern)>> 如何快速搞定第三方登入且易擴充套件? | 2021/11/03已更新 |
Tom彈架構:橋接模式(Bridge Pattern)>> 使用橋接模式設計複雜的訊息系統 | 2011/11/08已更新 |
6 行為型設計模式
標題 | 備註 |
---|---|
Tom彈架構:委派模式(Delegate Pattern)>> 你以為委派模式很神祕,其實你每天都在用 | 2021/11/09已更新 |
Tom彈架構:模板方法模式(Template Method Pattern)>> 搞懂鉤子方法和模板方法,看完這篇就夠了 | 2021/11/07已更新 |
Tom彈架構:策略模式(Strategy Pattern)>> 使用策略模式重構電商折扣和支付場景 | 2021/11/05已更新 |
Tom彈架構:責任鏈模式(Chain of Responsibility Pattern)>> 這才是責任鏈模式的優雅使用方式 | 2021/10/27已更新 |
Tom彈架構:迭代器模式(Iterator Pattern) | 待更新... |
Tom彈架構:命令模式(Command Pattern) | 待更新... |
Tom彈架構:狀態模式(State Pattern) | 待更新... |
Tom彈架構:備忘錄模式(Memento Pattern) | 待更新... |
Tom彈架構:中介者模式(Mediator Pattern) | 待更新... |
Tom彈架構:直譯器模式(Interpreter Pattern) | 待更新... |
Tom彈架構:觀察者模式(Observer Pattern) | 待更新... |
Tom彈架構:訪問者模式(Visitor Pattern) | 待更新... |
7 新設計模式
標題 | 備註 |
---|---|
Tom彈架構:物件池模式(Object Pool Pattern) | 待更新... |
Tom彈架構:規格模式(Specification Pattern) | 待更新... |
Tom彈架構:空物件模式(Null Object Pattern) | 待更新... |
Tom彈架構:僱工模式(Employee Pattern) | 待更新... |
8 一句話歸納設計模式
各種設計模式對比及程式設計思想總結如下表所示。
設計模式 | 一句話歸納 | 目 的 | 生活案例 | 框架原始碼舉例 |
---|---|---|---|---|
工廠模式(Factory Pattern) | 產品標準化, 生產更高效 |
封裝建立細節 | 實體工廠 | LoggerFactory、Calender |
單例模式(Singleton Pattern) | 世上只有一個我 | 保證獨一無二 | CEO | BeanFactory、Runtime |
原型模式(Prototype Pattern) | 拔一根猴毛, 吹出千萬個 |
高效建立物件 | 克隆 | ArrayList、PrototypeBean |
建造者模式(Builder Pattern) | 高配中配與低配, 想選哪配就哪配 |
開放個性配置步驟 | 選配 | StringBuilder、 BeanDefinitionBuilder |
代理模式(Proxy Pattern) | 沒有資源沒時間, 得找媒婆來幫忙 |
增強職責 | 媒婆 | ProxyFactoryBean、 JdkDynamicAopProxy、CglibAopProxy |
門面模式(Facade Pattern) | 開啟一扇門, 通向全世界 |
統一訪問入口 | 前臺 | JdbcUtils、RequestFacade |
裝飾器模式(Decorator Pattern) | 他大舅他二舅, 都是他舅 |
靈活擴充套件、 同宗同源 |
煎餅 | BufferedReader、InputStream |
享元模式(Flyweight Pattern) | 優化資源配置, 減少重複浪費 |
共享資源池 | 全國社保聯網 | String、Integer、ObjectPool |
組合模式(Composite Pattern) | 人在一起叫團伙, 心在一起叫團隊 |
統一整體和個體 | 組織架構樹 | HashMap、SqlNode |
介面卡模式(Adapter Pattern) | 萬能充電器 | 相容轉換 電源適配 | AdvisorAdapter、HandlerAdapter | |
橋接模式(Bridge Pattern) | 約定優於配置 | 不允許用繼承 | 橋 | DriverManager |
委派模式(Delegate Pattern) | 這個需求很簡單, 怎麼實現我不管 |
只對結果負責 | 授權委託書 | ClassLoader、 BeanDefinitionParserDelegate |
模板模式(Template Pattern) | 流程全部標準化, 需要微調請覆蓋 |
邏輯複用 | 把大象裝進冰箱 | JdbcTemplate、HttpServlet |
策略模式(Strategy Pattern) | 條條大道通北京, 具體哪條你來定 |
把選擇權交給使用者 | 選擇支付方式 | Comparator、 InstantiationStrategy |
責任鏈模式(Chain of Responsibility Pattern) | 各人自掃門前雪, 莫管他人瓦上霜 |
解耦處理邏輯 | 踢皮球 | FilterChain、Pipeline |
迭代器模式(Iterator Pattern) | 流水線上坐一天, 每個包裹掃一遍 |
統一對集合的訪問方式 | 逐個檢票進站 | Iterator |
命令模式(Command Pattern) | 運籌帷幄之中, 決勝千里之外 |
解耦請求和處理 | 遙控器 | Runnable、TestCase |
狀態模式(State Pattern) | 狀態驅動行為, 行為決定狀態 |
繫結狀態和行為 | 訂單狀態跟蹤 | Lifecycle |
備忘錄(Memento Pattern) | 失足不成千古恨, 想重來時就重來 |
備份,後悔機制 | 草稿箱 | StateManageableMessageContext |
中介者(Mediator Pattern) | 聯絡方式我給你, 怎麼搞定我不管 |
統一管理網狀資源 | 朋友圈 | Timer |
直譯器模式(Interpreter Pattern | 我想說“方言”, 一切解釋權歸我 |
實現特定語法解析 | 摩斯密碼 | Pattern、ExpressionParser |
觀察者模式(Observer Pattern) | 到點就通知我 | 解耦觀察者與被觀察者 | 鬧鐘 | ContextLoaderListener |
訪問者模式(Visitor Pattern) | 橫看成嶺側成峰, 遠近高低各不同 |
解耦資料結構和資料操作 | KPI考核 | FileVisitor、BeanDefinitionVisitor |
在《設計模式就該這樣學》一書中,還有大量的UML圖及易混淆的設計模式對比案例分析,也歡迎大家關注。
在日常應用中,設計模式從來都不是單個設計模式獨立使用的。在實際應用中,通常多個設計模式混合使用,你中有我,我中有你。下圖完整地描述了設計模式之間的混用關係,希望對大家有所幫助。
本文計劃1個月(即2021年11月30日前)連載完畢,請小夥伴們持續關注本文更新,大家可以先關注和收藏本文,感謝您的支援! 關注微信公眾號『 Tom彈架構 』回覆“設計模式”可獲取完整原始碼。 下一個連載專題預告《Spring核心原理與原始碼分析》。
本文為“Tom彈架構”原創,轉載請註明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支援是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術乾貨!