# Design Pattern 設計模式總覽

在 Design Patterns: Elements of Reusable Object-Oriented Software 一書中，提出並總結了一些常見軟體設計問題的標準解決方案，稱為 Design Pattern。並將這些方法分為三大類：Creational、Structural、Behavioral。其中 Design Pattern 有六大原則：

## 七大原則

### Open-Closed Principle 開放封閉原則
一個軟體實體如類、模組和函式應該對擴充套件開放，對修改關閉

### Liskov Substitution Principle 里氏替換原則
所有引用基類的地方必須能透明地使用其子類的物件

### Single Responsibility Principle 單一職責原則
一個 Class 只負責一項職責

### Dependency Inversion Principle 依賴反轉原則 
- 高層模組不應該依賴低層模組，兩者都應該依賴其抽象
- 抽象不應該依賴細節
- 細節應該依賴抽象

### Interface Segregation Principles 介面隔離原則 
一個 class 對另一個 class 的依賴應該建立在最小的介面上

### Law of Demeter / Least Knowledge Principle 迪米特原則
一個物件應該對其他物件有最少的瞭解

### Composite Reuse Principle 合成複用原則
儘量使用合成/聚合的方式，而不是使用繼承



* Creational 創建型

   用於處理建立物件的模式，其核心思想是要把物件的建立和使用分離。

  * Abstract factory 抽象工廠模式：提供一個建立相關或依賴物件的介面，而不指定物件的具體類
  * Builder 生成器模式：將一個複雜物件的建立與它的表示分離，使同樣的建立過程可以建立不同的表示
  * Dependency Injection 相依注入模式：傳遞依賴給調用方，而不是讓讓調用方直接獲得依賴
  * Factory method 工廠模式：允許一個類別的實例化推遲到子類中進行
  * Lazy initialization 延遲初始化模式：將物件的建立，某個值的計算，或者其他代價較高的過程推遲到它第一次需要時進行
  * Multiton 多例模式：確保一個類只有命名的實例，並提供對這些實例的全域存取
  * Object pool 物件池模式：通過回收不再使用的物件，避免建立和銷毀物件時代價高昂的取得和釋放資源的過程
  * Prototype 原型模式：使用原型實例指定要建立的物件類型，通過複製原型建立新的物件
  * RAII 資源取得即初始化模式：通過繫結到合適物件的生命周期來確保資源被適當地釋放
  * Singleton 單例模式：保證一個類只有一個實例，並且提供對這個實例的全域存取方式

* Structural 結構型

  處理 class 和 object 的組合

  * Adapter  轉接器模式：將一個物件的介面'轉接'成當事人預期的樣子
    * Adapter pipeline 轉接器導管模式：因除錯目的而使用多個轉接器
    * Retrofit Interface：同時使用多個類別的介面的轉接器
  * Bridge 橋接模式：將一個抽象與實現解耦，以便兩者可以獨立的變化
    * Tombstone 墓碑模式：一種中介的查詢物件，包含物件的實際位址
  * Composite 組合模式：樹狀結構的物件，每個物件有相同的介面
    * Aggregate 聚集模式：一種組合模式的版本，包含用於聚集子成員的成員函式
  * Decorator 修飾模式：對一個執行的類別，若使用繼承方式加上新功能可能會新類別的數量呈指數型地增加，可使用此模式來解決
  * Delegation
  * Extensibility 擴充模式：亦即框架，將複雜的程式碼隱藏在簡單的介面後
  * Facade 外觀模式：對於已有的介面建立一個簡化的介面以簡化使用共通任務
  * Flyweight 享元模式：通過共享以便有效的支持大量小顆粒對象
  * Front controller
  * Maker interface：
  * Module
  * Pipes and filters 導線及過濾器模式：一串的處理者，其中每個處理者的輸出是下一個的輸入
  * Opaque pointer
  * Proxy 代理模式：為其他對象提供一個代理以控制對這個對象的訪問
  * Twin

* Behavioral 行為型

  用來識別對象之間的常用交流模式並加以實現

  * Blackboard 黑板模式：
  * Chain of responsibility 責任鏈模式：處理命令物件或將之傳到下一個可以處理的物件
  * Command 命令模式：命令物件將動作及參數封裝起來
  * "Externalize the stack" "具現化堆疊"：使用堆疊將遞迴函式轉成重覆執行
  * Interpreter 直譯器模式：實作特製化的程式語言以解決一系列特殊的問題
  * Iterator 迭代器模式：迭代器用於存取包含器中元素而不用透露底層實作的方式
  * Mediator 調停者模式：對子系統中的介面集面提供一個統一的介面
  * Memento 備忘錄模式：使一個物件還原到前一個狀態的能力（rollback）
  * Null object 空物件模式：扮演預設物件的角色
  * Observer 觀察者模式：亦即發行／訂閱或事件聆聽者。物件註冊去聆聽由另一個物作所引發的事件
    * Weak reference 弱參照模式：將觀察者與可觀察間的藕合程度
  * Protocol stack 協議棧：通訊是由許多封裝成階層式的層所處理
  * Scheduled-task 排程任務模式：在特定區時或時間點執行排程任務(用於即時計算)
  * Servant 僱工模式：
  * Single-serving visitor：最佳化訪問者。使用一次後即行刪除
  * Specification 規格模式：以布林值的方式來重組事務邏輯
  * State 狀態模式：在執行可以部分改變物件的一種方法
  * Strategy 策略模式：在執行時依需求而選擇演算法
  * Template method 模板方法模式：描述一個程式的骨架
  * Visitor 觀察者模式：一種從物件中取出演算法的方式

* Concurrency 併發型

  用來處理多執行緒編程範式的一類設計模式

  * Active Object 主動物件模式：
  * Actor
  * Balking 阻礙模式：
  * Barrier 
  * Binding properties
  * Coroutine
  * Compute kernel
  * Double-checked locking 雙重檢查鎖定模式：
  * Event-based asynchronous
  * Fiber
  * Futex
  * Futures and promises
  * Guarded suspension 守衛模式：
  * Immutable object
  * Join
  * Leaders/followers
  * Lock
  * Messaging
  * Monitor object 監視物件模式：
  * Nuclear reaction
  * Proactor
  * Reactor 反應器模式：
  * Read write lock 讀寫鎖模式：
  * Scheduler 調度者模式：
  * STM
  * Thread pool 執行緒池模式：
  * Thread-local storage 執行緒本地儲存模式：

## Reference

- https://refactoring.guru/design-patterns
- https://iter01.com/516990.html
- https://www.wikiwand.com/zh-tw/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F_(%E8%AE%A1%E7%AE%97%E6%9C%BA)
- https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/589577
