## 1. 定義
>每個子類都對應一個工廠子類,利用多態特性動態創建對象的模式,就是工廠方法模式。
## 2. 場景
>**復習:** 簡單工廠模式--- 創建一個工廠類,專門用于對象的創建(根據傳入不同的參數,創建不同的對象)
>**問題:** 如果新增加一個手機子類,手機工廠就要增加新的if-else判斷,違反了開閉原則(對擴展開放、對修改關閉)
>**解決方法:** 可以為每一個手機子類創建對應的工廠子類,這些子類分別實現抽象的工廠接口,這樣我們只需實例化不同的工廠子類,調用創建方法,得到的就是對應的手機對象,是背后是面向對象的多態特性。
## 3. 重構簡單工廠代碼
`重構代碼:`
> 每個子類都有自己對應的工廠類
~~~
public interface IPhone {
void packaging();
}
~~~
~~~
public interface PhoneFactory {
IPhone packaging();
}
~~~
~~~
public class HWPhone implements IPhone {
@Override
public void packaging() {
System.out.println("華為手機");
}
}
~~~
~~~
public class HWPhoneFactory implements PhoneFactory {
@Override
public IPhone packaging() {
System.out.println("這是生產華為手機工廠");
return new HWPhone();
}
}
~~~
~~~
public class MIPhone implements IPhone {
@Override
public void packaging() {
System.out.println("小米手機");
}
}
~~~
~~~
public class MIPhoneFactory implements PhoneFactory {
@Override
public IPhone packaging() {
System.out.println("這是生產小米手機的工廠");
return new MIPhone();
}
}
~~~
~~~
public class Store {
public void sellPhone(PhoneFactory phone) {
phone.packaging();
}
}
~~~
`測試類:`
~~~
public class TestFactory {
public static void main(String[] args) {
PhoneFactory hwPhone = new HWPhoneFactory();
PhoneFactory xmPhone = new MIPhoneFactory();
Store store = new Store();
store.sellPhone(hwPhone);
}
}
~~~
## 4. 代碼結構圖

## 5. 總結
> 由此可以看出工廠方法規避了簡單工廠if-else造成的判斷,并且也解決了新添加手機子類需要修改原工廠類的代碼,符合了開閉原則。
> 但是如果需要創建的子類越來越多,不止只有手機,還有ipad、電腦什么的,難道每一個子類都要對應一個工廠類嗎?
> 解決上述問題的辦法是抽象工廠模式。參考下節........
- 前言
- 第一章 設計七大原則
- 第1節 開閉原則
- 第2節 依賴倒置原則
- 第3節 單一職責原則
- 第4節 接口隔離原則
- 第5節 迪米特法則
- 第6節 里氏替換原則
- 第7節 合成復用原則
- 第二章 簡單工廠模式
- 第1節 使用場景
- 第2節 示例代碼
- 第三章 創建者模式
- 第1節 工廠方法模式
- 第2節 抽象工廠模式
- 第3節 建造者模式
- 第4節 原型模式
- 第5節 單例模式
- 第四章 結構型模式
- 第1節 適配器模式
- 第2節 橋接模式
- 第3節 組合模式
- 第4節 裝飾者模式
- 第5節 外觀模式
- 第6節 享元模式
- 第7節 代理模式
- 第五章 行為模式
- 第1節 責任鏈模式
- 第2節 命令模式
- 第3節 迭代器模式
- 第4節 中介者模式
- 第5節 備忘錄模式
- 第6節 觀察者模式
- 第7節 狀態模式
- 第8節 策略模式
- 第9節 模板方法模式
- 第10節 訪問者模式
- 第11節 解釋器模式