---
# System prepended metadata

title: Design Pattern-類型有哪些
tags: [DesignPattern, Catalog]

---

Design Pattern-類型有哪些
===
# 前言
* 此技術文件及超連結記錄著Udemy上Dmitri Nesteruk的Design Patterns in Modern C++的一些學習筆記，並試著給出一些基本範例。
* 程式基本範例我通常盡量會想一些比較通俗的例子好理解，如果一時之間想不到會借助一下ChatGPT
# 介紹
* 針對程式語言中常出現的問題所提出的解決方法，名詞術語由Erich Gamma等人在1990年代從建築設計領域引入到電腦科學的。通常有以下三中類型
* Creational Pattern 創建型模式
    * 用於描述如何建立物件
* Structural Pattern 結構型模式
    * 描述了在保持原結構的彈性和效能下，如何將類別或物件透過複合(composition)、繼承(inheritance)的方式，建構出更大更複雜的架構。
* Behavioral Pattern 行為型模式
    * 描述物或類別之間的使用，例如管理物件、物件間的協作

# Creational Pattern 創建型模式

| Pattern Name                                        |應用                            |舉例
| --------------------------------------------------  |-------------------------------|--------------------------
|[Builder](https://hackmd.io/5CFWptesRdGVVs8IP_tVyw)  |創建物件且簡化參數介面             | I15,I15 Pro, I15Plus規格設定
|[Factory](https://hackmd.io/HLmgbI0XQ7KQT9yc7Ydl8g)  |創建特定規格的物件                | 特定形狀的肉品製作
|[Prototype](https://hackmd.io/9KOgUsCuRFSuOSq-c5Ql2A)|創建新物件時直接複製以創造的物件內容 | new一個車的class並複製後再做修改
|[Singleton](https://hackmd.io/EwmEZoSzR3WwB6w6FS0Edg)|實體化的類別在程式中唯一的時候      | 資料庫,實體化性能開銷較大的class

# Structural Pattern 結構型模式
| Pattern Name                                        | 應用                               |舉例
| ----------------------------------------------------|-----------------------------------|-----------------
|[Adapter](https://hackmd.io/h2Eojn2CQHewD4TN1vcHpA)  |不同類別需轉換數據或方法時              |匯率轉換、電壓
|[Bridge](https://hackmd.io/mBaKePEeRVm4uBvpCAFpSw)   |降低繼承及區分對內對外的實作細節         |電腦或手機使用特定OS 
|[Composite](https://hackmd.io/mfNd_AlKSSmZshnPySI8DA)|用來處理樹狀結構的資料                 |資料夾、書本目錄子章節、Tree的leave跟node
|[Decorator](https://hackmd.io/ccDhxD1PTT2-qErJWGGhLg)|為物件添加額外屬性                    |奶茶添加珍珠、布丁
|[Facade](https://hackmd.io/HfZYieYHQhqs8Hb7ASqd6Q)   |用於簡化對外的API窗口|一鍵設置功能
|[Flyweight](https://hackmd.io/KbQ4hA1ESCqycCGW3vIjDA)|盡量減少相同物件的建立以減少記憶體開銷    |遊戲腳色開發
|[Proxy](https://hackmd.io/Z51-5CLSSC2YHQbz814ebg)    |將原方法做轉介                        |電視盒轉介電視頻道的影片、請人代購


# Behavioral Pattern 行為型模式
| Pattern Name                                                      | 應用                   |舉例
| ------------------------------------------------------------------| ----------------------|-------------
|[Observer](https://hackmd.io/_onm1d7QQqyFraDGD2TAEA)               | 一對多的狀態或資訊更新    |youtube影片更新
|[State](https://hackmd.io/CtALz-G2Q8Wz7ufqAm6xMA)                  | 狀態切換即執行動作        |遊戲腳色狀態變化
|[Strategy](https://hackmd.io/eVZBB2TASl60xo3RB1wntA)               | 透過物件的選取來決定應對方式|付錢（現金,信用卡,QR code)
|[Chain of Responsibility](https://hackmd.io/qgCyRM4FTJ-HRX-znavXXw)| 多個對象處理一個請求      |登機手續、學校畢業手續
|[Command](https://hackmd.io/YQPd9H-VTYeaiq4AILsf4Q)                | 維護及執行一系列的請求    |遙控器控制設備
|[Interpreter](https://hackmd.io/UaZtBTb1QV6uqFdofPyZuQ?both)       | 語法規則建立             |四則運算
|[Iterator](https://hackmd.io/w0om4D4lRXKNwyIJpToRBw)               | 訪問及操作特定資料結構     |遍歷tree、list、vector...
|[Mediator](https://hackmd.io/fJxW3_6PSpmJf_7Of8nCcA?both)          | 減少相同類別的依賴關係     |聊天室、塔台
|[Memento](https://hackmd.io/rG1Gj7QZQGy5WoMysbw1ow)                | 用來記錄之前的狀態且可回復  |遊戲進度儲存及讀取
|[Template](https://hackmd.io/RoHpS19_RG6Pgq1-9bNL3w)               | 透過繼承來擴展方法        |食譜順序
|[Visitor](https://hackmd.io/fYIzKW_kRMKsJKfBi1aPQQ)                | 數據結構穩定的情況下訪問不同元素| 程式訪問不同形狀類別並互叫現在是什麼形狀、訪可來學校遇到不同人

github : https://github.com/GU-Lin/Design_Pattern_Practice
source : https://ithelp.ithome.com.tw/articles/10320610?sc=rss.iron
###### tags : `Catalog` `DesignPattern`


