# 27. Comparison of Design Patterns ###### tags: `DesignPatterns` ## 關於 Comparison of Design Patterns 本篇將討論以下幾個問題 > ### 1. 前言 > ### 2. 三大分類各自的意圖 > ### 3. Comparison --- ## 1. 前言 Design Patterns 這系列終於到了最後一篇,經過前面一連串的洗禮後是否覺得每個 Pattern 個別理解都沒什麼問題,但參在一起~~做撒尿牛丸~~又說不太出其間的差異呢? 每個 Design Pattern 都有其想解決的問題跟使用上的缺陷,所以在能夠靈活運用之前,有些方法可以幫助我們找到適合的 Pattern 1. 釐清目前想解決的問題 2. 依據 Pattern 的「**意圖**」來尋找適合的 Pattern 3. 套用時若需要變形,是否會有什麼新的**缺點** 4. 套用後是否有明顯的**好處**,且大於**缺點** 一一確認完之後,除了能更加熟悉之外,也避免了為套用而套用造成的系統複雜度提升跟擴充困難的問題。 但若是因為未來還不確定的需求而不知道該不該套用,我的建議是:未來的需求就交給**重構**來解決,專注於當下的問題即可。 --- ## 2. 三大分類各自的意圖 | 類型 | | | -------- | -------- | | 創建型 | 負責物件的創建,將創建與使用解耦 | | 結構型 | class 或物件的組合,將不同的職責解耦 | | 行為型 | class 或物件間的交互行為,將不同的行為解耦 | --- ## 3. Comparison | ● 創建複雜物件 | | | -------- | -------- | | [Abstract Factory(抽象工廠)](https://waynecheng.coderbridge.io/2021/01/10/Creational-02-AbstractFactory/) | 創建包含一系列彼此關聯的物件 | | [Builder(建造者)](https://waynecheng.coderbridge.io/2021/01/11/Creational-03-Builder/) | 創建過程複雜物件 | | [Factory Method(工廠方法)](https://waynecheng.coderbridge.io/2021/01/10/Creational-01-FactoryMethod/) | 創建複數個複雜物件 | | [Prototype(原型)](https://waynecheng.coderbridge.io/2021/01/12/Creational-04-Prototype/) | 創建成本較高物件 | - | ● 創建唯一物件 | | | -------- | -------- | | [Singleton(單例)](https://waynecheng.coderbridge.io/2021/01/13/Creational-05-Singleton/) | 保證物件全局唯一 | - | ● 物件對接 | | | -------- | -------- | | [Adapter(轉接器)](https://waynecheng.coderbridge.io/2021/01/14/Structural-06-Adapter/) | 接口無法對應問題,改變原始 class 接口 | | [Bridge(橋接)](https://waynecheng.coderbridge.io/2021/01/16/Structural-07-Bridge/) | 分離接口與實作,複雜物件間的組合 | | [Decorator(裝飾者)](https://waynecheng.coderbridge.io/2021/01/17/Structural-9-Decorator/) | 不改變原始 class 接口條件下,增強原有功能 | | [Facade(門面)](https://waynecheng.coderbridge.io/2021/01/18/Structural-10-Facade/) | 整合多個接口 | | [Proxy(代理)](https://waynecheng.coderbridge.io/2021/01/20/Structural-12-Proxy/) | 控制訪問,而非加強功能 | | [Mediator(中介者)](https://waynecheng.coderbridge.io/2021/01/25/Behavioral-17-Mediator/) | 物件間複雜相依邏輯,包含雙向關係 | - | ● 兩個維度 | | | -------- | -------- | | [Bridge(橋接)](https://waynecheng.coderbridge.io/2021/01/16/Structural-07-Bridge/) | 兩個維度皆可擴充 | | [Visitor(訪問者)](https://waynecheng.coderbridge.io/2021/01/31/Behavioral-23-Visitor/) | 其中一個維度固定 | - | ● 接收與發送行為 | | | -------- | -------- | | [Chain of Responsibility(責任鏈)](https://waynecheng.coderbridge.io/2021/01/21/Behavioral-13-ChainOfResponsibility/) | 依序將請求傳遞給接續處理物件 | | [Command(命令)](https://waynecheng.coderbridge.io/2021/01/22/Behavioral-14-Command/) | 單方面將請求發送給處理者 | | [Mediator(中介者)](https://waynecheng.coderbridge.io/2021/01/25/Behavioral-17-Mediator/) | 物件間複雜相依邏輯,包含雙向關係 | | [Observer(觀察者)](https://waynecheng.coderbridge.io/2021/01/27/Behavioral-19-Observer/) | 處理者動態決定是否接收請求 | - | ● 依序處理 | | | -------- | -------- | | [Decorator(裝飾者)](https://waynecheng.coderbridge.io/2021/01/17/Structural-9-Decorator/) | 依序處理,全部完成才結束,無法中斷 | | [Chain of Responsibility(責任鏈)](https://waynecheng.coderbridge.io/2021/01/21/Behavioral-13-ChainOfResponsibility/) | 依序處理,目的達成即結束 | - | ● 呼叫端指定 | | | -------- | -------- | | [Command(命令)](https://waynecheng.coderbridge.io/2021/01/22/Behavioral-14-Command/) | 控制行為(e.g. 執行、取消) | | [Strategy(策略)](https://waynecheng.coderbridge.io/2021/01/29/Behavioral-21-Strategy/) | 提供選擇,由呼叫端選擇程式中部分執行邏輯 | - | ● 邏輯抽換 | | | -------- | -------- | | [Strategy(策略)](https://waynecheng.coderbridge.io/2021/01/29/Behavioral-21-Strategy/) | 基於組合 | | [Template Method(樣板方法)](https://waynecheng.coderbridge.io/2021/01/30/Behavioral-22-TemplateMethod/) | 基於繼承 | - | ● 狀態變換 | | | -------- | -------- | | [Memento(備忘錄)](https://waynecheng.coderbridge.io/2021/01/26/Behavioral-18-Memento/) | 紀錄物件本身狀態提供還原 | | [State(狀態)](https://waynecheng.coderbridge.io/2021/01/28/Behavioral-20-State/) | 依據呼叫端狀態,大量 if/else 時的解決方案 | - | ● 大量物件 | | | -------- | -------- | | [Flyweight(享元)](https://waynecheng.coderbridge.io/2021/01/19/Structural-11-Flyweight/) | 大量高度相似物件複用,節省記憶體 | - | ● 特殊結構 | | | -------- | -------- | | [Composite(組合)](https://waynecheng.coderbridge.io/2021/01/16/Structural-08-Composite/) | 樹狀結構 | | [Interpreter(直譯器)](https://waynecheng.coderbridge.io/2021/01/23/Behavioral-15-Interpreter/) | 依據已定義邏輯進行複雜轉換 | | [Iterator(迭代器)](https://waynecheng.coderbridge.io/2021/01/24/Behavioral-16-Iterator/) | 常與其他模式搭配<br> 1. with Composite(組合):遍歷樹狀結構<br> 2. with Memento(備忘錄):遍歷已備份狀態 | --- ## 總結 ### Design Patterns 應用的深度與廣度都不是看完本系列就能掌握的,還有很多細節的應用並未提及,全篇都圍繞在基本概念的理解上,至此相信已經能解決部分問題了,若是想更深入學習 Design Patterns 可以購買書籍來閱讀,推薦以下兩本。 ### [大話設計模式](https://www.tenlong.com.tw/products/9789866761799) ### [深入淺出設計模式 (Head First Design Patterns)](https://www.tenlong.com.tw/products/9789867794529) --- ## 參考資料 1. [Design Patterns](https://en.wikipedia.org/wiki/Design_Patterns) 2. [大話設計模式](https://www.tenlong.com.tw/products/9789866761799) 3. [dofactory](https://www.dofactory.com/) 4. [Refactoring.Guru](https://refactoring.guru/) --- ## 新手上路,若有錯誤還請告知,謝謝
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up