### **場景概述**
舉一個店鋪售賣不同品牌手機的例子:店鋪,即客戶端類向手機工廠購進手機售賣。
1. 最開始實例化一個商店,商店打算賣華為手機
2. 商店委托工廠給他制作一臺HWPhone手機,傳入對應的字段tag。
3. 手機生產好以后打包送到商店
4. 商店售賣手機
### **場景分析**
該場景可以使用簡單工廠的角色來設計:
* 抽象產品:Phone,是所有具體產品類的父類,提供一個公共接口packaging表示手機的裝箱并送到店鋪。
* 具體產品:不同品牌的手機,小米手機類(MIPhone),華為手機類(HWPhone)。
* 工廠:PhoneFactory根據不同的參數來創建不同的手機。
* 客戶端類:店鋪類Store負責售賣手機。
### **代碼實現**
抽象產品類Phone:
~~~
public abstract class AbstractPhone {
public abstract void packaging();
}
~~~
具體產品類 MIPhone:
~~~
public class MIPhone extends AbstractPhone {
@Override
public void packaging() {
System.out.println("小米手機");
}
}
~~~
具體產品類:HWPhone:
~~~
public class HWPhone extends AbstractPhone {
@Override
public void packaging() {
System.out.println("華為手機");
}
}
~~~
以上是抽象產品類以及它的2個子類:小米手機類和華為手機類
下面看一下工廠類 PhoneFactory:
~~~
public class PhoneFactory {
public IPhone createPhoneWithTag(String tag) {
IPhone phone = null;
switch (tag) {
case "XM":
phone = new MIPhone();
break;
case "HW":
phone = new HWPhone();
break;
default:
}
return phone;
}
}
~~~
>工廠類向外部(客戶端)提供了一個創造手機的接口createPhoneWithTag:,根據傳入參數的不同可以返回不同的具體產品類。因此客戶端只需要知道它所需要的產品所對應的參數即可獲得對應的產品了。
在本例中,我們聲明了店鋪類 Store為客戶端類:
~~~
public class Store {
public void sellPhone(IPhone phone) {
phone.packaging();
}
}
~~~
>客戶端類聲明了一個售賣手機的接口sellPhone:。表示它可以售賣作為參數所傳入的手機。
最后我們用代碼模擬一下這個實際場景:
~~~
public static void main(String[] args) {
PhoneFactory factory = new PhoneFactory();
IPhone hw = factory.createPhoneWithTag("HW");
Store store = new Store();
store.sellPhone(hw);
}
~~~
在這里我們需要注意的是:商店從工廠拿到手機不需要了解手機制作的過程,只需要知道它要工廠做的是手機(只知道IPhone類即可),和需要給工廠類傳入它所需手機所對應的參數即可(這里HWPhone手機對應的參數就是tag)。
### **代碼對應的類圖:**

## **優點**
* 客戶端只需要給工廠類傳入一個正確的(約定好的)參數,就可以獲取你所需要的對象,而不需要知道其創建細節,一定程度上減少系統的耦合。
* 客戶端無須知道所創建的具體產品類的類名,只需知道具體產品類所對應的參數即可,減少開發者的記憶成本。
## **缺點**
* 如果業務上添加新產品的話,就需要修改工廠類原有的判斷邏輯,這其實是違背了開閉原則的。
* 在產品類型較多時,有可能造成工廠邏輯過于復雜。所以簡單工廠模式比較適合產品種類比較少而且增多的概率很低的情況。
- 前言
- 第一章 設計七大原則
- 第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節 解釋器模式