# 創建型模式
* 簡單工廠
* 工廠方法
* 抽象工廠
* 建造者
* 原型
* 單例
## 簡單工廠
### 概要
* 對產品類抽象化,由具體產品類實現抽象產品類
* 工廠類負責實例化具體產品類,通過方法調用
### 優點
將產品類的實例話與客戶端剝離解藕
### 缺點
新增產品類時需要修改工廠類,不滿足開放-封閉原則的(對修改類封閉)這一條
## 工廠方法
在簡單工廠的基礎上,進一步對工廠類抽象化,不同產品類由具體工廠類實例化
### 優點
解決了簡單工廠不滿足封閉原則的問題
### 缺點
增加了工作量,每新增一個產品類,需要新增對應的工廠類
## 抽象工廠
* 存在多個抽象產品AbstractProductA,AbstractProductB,因為各自可能存在不同的實現
* 工廠類需要支持創建多種產品
### 優點
切換Factory十分簡單,只要在客戶端實例化不一樣的Factory類就可以
### 缺點
* 新增Product繁瑣,抽象產品類,對應工廠數量的產品類
* 修改1+N個工廠類,(1表示是工廠抽象類,N表示實現了抽象工廠的類數量)增加創建新產品類的方法 ----- 不符合開放封閉原則中的對類內部修改封閉的限制
## 使用簡單工廠優化抽象工廠
新建DataAccess類,代替 工廠抽象類&工廠類,來創建產品類。
DataAccess類新增字段屬性type,表示當前的工廠類型。
創建產品類時,根據屬性type 通過switch case 來創建指定的類。
### 優點
切換工廠時,只需要修改屬性type值
新增產品時,只需要新增創建新產品的方法
### 缺點
修改的文件數從1+N減小為1,但還沒有滿足封閉原則。
## 使用反射來代替switch case
通過配置的屬性type 實例化指定的產品
## 建造者
### 描述
抽象建造者類+若干實現類。建造者類中的方法調用產品類
### 案例
* 做魚香肉絲
* 制作麥當勞
將對象的構建與它的表示分離。同樣的構建過程可以創建不同的表示。
### 抽象建造者 + 建造者實現類
#### 優點
建造者實現類 繼承 抽象建造者,并實現抽象方法。
#### 缺點
需要在客戶端調用這些建造方法
### 引入指揮者類(Director)
實例化指揮者類的時候傳入具體的建造者。
指揮者類使用建造者控制建造過程,并隔離建造者和客戶端