# 创建型模式
* 简单工厂
* 工厂方法
* 抽象工厂
* 建造者
* 原型
* 单例
## 简单工厂
### 概要
* 对产品类抽象化,由具体产品类实现抽象产品类
* 工厂类负责实例化具体产品类,通过方法调用
### 优点
将产品类的实例话与客户端剥离解藕
### 缺点
新增产品类时需要修改工厂类,不满足开放-封闭原则的(对修改类封闭)这一条
## 工厂方法
在简单工厂的基础上,进一步对工厂类抽象化,不同产品类由具体工厂类实例化
### 优点
解决了简单工厂不满足封闭原则的问题
### 缺点
增加了工作量,每新增一个产品类,需要新增对应的工厂类
## 抽象工厂
* 存在多个抽象产品AbstractProductA,AbstractProductB,因为各自可能存在不同的实现
* 工厂类需要支持创建多种产品
### 优点
切换Factory十分简单,只要在客户端实例化不一样的Factory类就可以
### 缺点
* 新增Product繁琐,抽象产品类,对应工厂数量的产品类
* 修改1+N个工厂类,(1表示是工厂抽象类,N表示实现了抽象工厂的类数量)增加创建新产品类的方法 ----- 不符合开放封闭原则中的对类内部修改封闭的限制
## 使用简单工厂优化抽象工厂
新建DataAccess类,代替 工厂抽象类&工厂类,来创建产品类。
DataAccess类新增字段属性type,表示当前的工厂类型。
创建产品类时,根据属性type 通过switch case 来创建指定的类。
### 优点
切换工厂时,只需要修改属性type值
新增产品时,只需要新增创建新产品的方法
### 缺点
修改的文件数从1+N减小为1,但还没有满足封闭原则。
## 使用反射来代替switch case
通过配置的属性type 实例化指定的产品
## 建造者
### 描述
抽象建造者类+若干实现类。建造者类中的方法调用产品类
### 案例
* 做鱼香肉丝
* 制作麦当劳
将对象的构建与它的表示分离。同样的构建过程可以创建不同的表示。
### 抽象建造者 + 建造者实现类
#### 优点
建造者实现类 继承 抽象建造者,并实现抽象方法。
#### 缺点
需要在客户端调用这些建造方法
### 引入指挥者类(Director)
实例化指挥者类的时候传入具体的建造者。
指挥者类使用建造者控制建造过程,并隔离建造者和客户端