---
# System prepended metadata

title: 1. Design Pattern
tags: [DesignPatterns]

---

# 1. Design Pattern

###### tags: `DesignPatterns`

## 關於 Design Pattern 本篇將討論以下幾個問題

> ### 1. 什麼是 Design Pattern？
> ### 2. Design Pattern 的分類？
> ### 3. 什麼是 UML？
> ### 4. 本系列文必學的 UML
   
---
## 1. 什麼是 Design Pattern？
在軟體工程中，設計模式（design pattern）是對軟體設計中普遍存在（反覆出現）的各種問題，所提出的解決方案。 by [wikipedia](https://ppt.cc/fMqtrx)

一般在學習 Design Pattern 都是依照四人幫(Gang of Four, GoF)於 1994 年出版的書籍(Design Patterns: Elements of Reusable Object-Oriented Software)內容為主，封面如下圖。
![](https://i.imgur.com/SnGRT0p.jpg)

---
## 2. Design Pattern 的分類？
Design Patterns 書中的 23 種設計模式主要分為三大類：
1. 創建型 (Creational Patterns)
2. 結構型 (Structural Patterns)
3. 行為型 (Behavioral Patterns)

#### 創建型 (Creational Patterns)
| Patterns | 說明 |
|---------|---------|
| [Abstract Factory 抽象工廠](https://waynecheng.coderbridge.io/2021/01/10/Creational-02-AbstractFactory/) | Creates an instance of several families of classes |
| [Builder 建造者](https://waynecheng.coderbridge.io/2021/01/11/Creational-03-Builder/) | Separates object construction from its representation |
| [Factory Method 工廠方法](https://waynecheng.coderbridge.io/2021/01/10/Creational-01-FactoryMethod/) | Creates an instance of several derived classes |
| [Prototype 原型](https://waynecheng.coderbridge.io/2021/01/12/Creational-04-Prototype/) | A fully initialized instance to be copied or cloned |
| [Singleton 單例](https://waynecheng.coderbridge.io/2021/01/13/Creational-05-Singleton/) | A class of which only a single instance can exist |

#### 結構型 (Structural Patterns)
| Patterns | 說明 |
|---------|---------|
| [Adapter 轉接器](https://waynecheng.coderbridge.io/2021/01/14/Structural-06-Adapter/) | Match interfaces of different classes |
| [Bridge 橋接](https://waynecheng.coderbridge.io/2021/01/16/Structural-07-Bridge/) | Separates an object’s interface from its implementation |
| [Composite 組合](https://waynecheng.coderbridge.io/2021/01/16/Structural-08-Composite/) | A tree structure of simple and composite objects |
| [Decorator 裝飾者](https://waynecheng.coderbridge.io/2021/01/17/Structural-9-Decorator/) | Add responsibilities to objects dynamically |
| [Facade 門面](https://waynecheng.coderbridge.io/2021/01/18/Structural-10-Facade/) | A single class that represents an entire subsystem |
| [Flyweight 享元](https://waynecheng.coderbridge.io/2021/01/19/Structural-11-Flyweight/) | A fine-grained instance used for efficient sharing |
| [Proxy 代理](https://waynecheng.coderbridge.io/2021/01/20/Structural-12-Proxy/) | An object representing another object |

#### 行為型 (Behavioral Patterns)
| Patterns | 說明 |
|---------|---------|
| [Chain of Responsibility 責任鏈](https://waynecheng.coderbridge.io/2021/01/21/Behavioral-13-ChainOfResponsibility/) | A way of passing a request between a chain of objects |
| [Command 命令](https://waynecheng.coderbridge.io/2021/01/22/Behavioral-14-Command/) | Encapsulate a command request as an object |
| [Interpreter 直譯器](https://waynecheng.coderbridge.io/2021/01/23/Behavioral-15-Interpreter/) | A way to include language elements in a program |
| [Iterator 迭代器](https://waynecheng.coderbridge.io/2021/01/24/Behavioral-16-Iterator/) | Sequentially access the elements of a collection |
| [Mediator 中介者](https://waynecheng.coderbridge.io/2021/01/25/Behavioral-17-Mediator/) | Defines simplified communication between classes |
| [Memento 備忘錄](https://waynecheng.coderbridge.io/2021/01/26/Behavioral-18-Memento/) | Capture and restore an object's internal state |
| [Observer 觀察者](https://waynecheng.coderbridge.io/2021/01/27/Behavioral-19-Observer/) | A way of notifying change to a number of classes |
| [State 狀態](https://waynecheng.coderbridge.io/2021/01/28/Behavioral-20-State/) | Alter an object's behavior when its state changes |
| [Strategy 策略](https://waynecheng.coderbridge.io/2021/01/29/Behavioral-21-Strategy/) | Encapsulates an algorithm inside a class |
| [Template Method 樣板方法](https://waynecheng.coderbridge.io/2021/01/30/Behavioral-22-TemplateMethod/) | Defer the exact steps of an algorithm to a subclass |
| [Visitor 訪問者](https://waynecheng.coderbridge.io/2021/01/31/Behavioral-23-Visitor/) | Defines a new operation to a class without change |

---
## 3. 什麼是 UML？
統一塑模語言(Unified Modeling Language, UML)，一種標準化的建模語言，例如以標準化的圖形來表達一個系統的結構與內部各原件之間關係。

將抽象的概念畫作圖形來說明，由於所使用的圖形有一套標準化的規則，所以儘管沒有文字敘述的輔助依然能讓人理解。

---
## 4. 本系列文必學的 UML
由於 UML 博大精深，並非三言兩語就能讓人理解透徹，但圖形化的 UML 對於理解 Design Pattern 的抽象概念有著莫大的幫助，所以在此僅介紹 Design Pattern 會使用到的部分。

首先 Design Pattern 所使用的 UML 類型稱為**類別圖型(Class Diagrams)**

#### 圖型
![](https://i.imgur.com/3rYMxVa.jpg)

- 第一層：class 名稱
- 第二層：class 中包含的屬性
- 第三層：class 中包含的方法或行為

#### 線條 & 箭頭
![](https://i.imgur.com/ksmrvgh.jpg)
- 實線 + 箭頭(Association)：類別間相互**關聯**，箭頭表示方向性
- 虛線 + 箭頭(Dependency)：類別間**依賴**關係，箭頭表示方向性

![](https://i.imgur.com/HYPPv2e.jpg)
- 實線 + 空心三角形(Generalization)：類別間**繼承**關係，空心三角形指向父類別
- 虛線 + 空心三角形(Implementaition)：實作與 Interface 間關係，空心三角形指向 Interface

![](https://i.imgur.com/vo3ZHzf.jpg)
- 實線 + 空心菱形(Shared Aggregation)：空心菱形端類別**可**包含箭頭端類別(e.g. 學校可包含學生)
- 實線 + 實心菱形(Composite Aggregation)：實心菱形端類別為**部分**，箭頭端類別為**整體**(e.g. 整體→鳥，部分→翅膀)

---
## 總結
### 本系列定位在讓初學 Design Pattern 的人能夠理解每個 Pattern 的基本架構與概念，當遇到實際情況時，能夠以本系列提供的情境做為發想，再進一步套用至複雜情境，將 Design Pattern 化作能上陣殺敵的武器。

### Design Pattern 是為了簡化問題而產生的解決方案，不使用一樣能寫出功能相同的程式，但初學時就盡其所能的套用 Design Pattern 可能導致過度設計，造成系統複雜化與後續維護、擴充上的困難，不可不慎。

---

## 新手上路，若有錯誤還請告知，謝謝
