簡單工廠模式
可以根據參數的不同返回不同類的實例
參考:
- CSDN|簡單工廠模式
簡單工廠通過傳給工廠類的參數的不同,返回不同的對象,包括三部分組成:
- 具體的”產品“
- 工廠類(實例化并返回”產品“)
- 客戶端(使用”產品“)
為什么使用簡單工廠:
- ”產品“的創建過程可能很復雜,涉及到多個不同類之間的依賴,通過簡單工廠將創建過程隱藏在工廠類中,一方面減輕了客戶端使用該產品的難度,另一方面也防止了客戶端錯誤創建產品造成的安全問題。
- 將產品的生產和消費過程分離開,這樣如果要有了一個新的產品,只需要把它加入到工廠類中,客戶端需要時工廠類就會返回給它,否則的話,每次添加一個新的產品,都需要修改客戶端代碼,違反開閉原則。
簡單工廠的缺點:
- 系統過度依賴工廠類,工廠類作為一個”上帝類“,負責創建客戶端需要的所有對象,導致一旦工廠類出錯,整個系統就會崩潰。
- 如果”產品類“特別多,工廠類中就會有很多個分支,造成工廠類異常龐大,難以維護。
- 每次添加新的產品都要修改工廠類,從工廠類的角度看違反了”開閉原則“,也不利于系統拓展。
- 工廠方法一般是靜態方法,不利于繼承。
適用場景
-
工廠類負責創建的對象比較少:由于創建的對象較少,不會造成工廠方法中的業務邏輯太過復雜。
-
客戶端只知道傳入工廠類的參數,對于如何創建對象不關心:客戶端既不需要關心創建細節,甚至連類名都不需要記住,只需要知道類型所對應的參數。
例:
如果需要獲取不同的手機對象,就可以使用簡單工廠,具體的手機對象依賴于CPU, Camera等,通過簡單工廠的封裝,客戶端獲取 Phone 對象時就不需要了解具體的 ”生產過程“了.
實例化CPU, Camera 等配件時,也應該使用簡單工廠。

package pers.junebao.simple_factory;import pers.junebao.simple_factory.fitting.*;
import pers.junebao.simple_factory.phone.Honor;
import pers.junebao.simple_factory.phone.OnePlus;
import pers.junebao.simple_factory.phone.Phone;public class PhoneFactory {/*** 一個用來產生 Phone 對象的工廠方法* @param name 根據 name 產生不同的 Phone 的子類對象* @return 返回實例化后的對象,name 不匹配返回 null*/public static Phone getPhone(String name) {if(name.toLowerCase().equals("oneplus")){// TODO:使用簡單工廠重構CPU cpu = new Qualcomm();Camera camera = new Sony();return new OnePlus(cpu, camera);} else if (name.toLowerCase().equals("honor")) {CPU cpu = new Kirin();Camera camera = new Leica();return new Honor(cpu, camera);} else {return null;}}
}
package pers.junebao.simple_factory;import pers.junebao.simple_factory.phone.Phone;public class Consumer {public static void main(String[] args) {Phone phone = PhoneFactory.getPhone("Honor");assert phone != null;phone.printConfig();}
}
GitHub | 完整代碼