簡單工廠模式詳解
一,概述
簡單工廠模式屬於創建型模式又叫做靜態工廠方法模式,它屬於類創建型模式。在簡單工廠模式中,可以根據參數的不同返回不同類的實例。
簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常都具有共同的父類。
簡單工廠只需要傳入一個正確的參數,就可以獲取所需要的對象,而無需知道其實現過程。
簡單工廠模式中用於被創建實例的方法通常為靜態(static)方法,因此簡單工廠模式又被成為靜態工廠方法(Static Factory Method)。
下面由我深入淺出的給大家講解下簡單工廠模式,不足之處還望批評指正。
二,結構圖
- Factory:工廠類,簡單工廠模式的核心,它負責實現創建所有實例的內部邏輯。工廠類的創建產品類的方法可以被外界直接調用,創建所需的產品對象。
- IProduct:抽象產品類,簡單工廠模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
- Product:具體產品類,是簡單工廠模式的創建目標
三,簡單工廠舉例說明
四,具體代碼實現
第一步:我們首先創建我們的食品基類,也就是食品父類,也就是我們結構圖中抽象產品類,這是個抽象類。
package pattern.simplenessfactory; /** *產品抽象類 * @author ningbeibei * */ public abstract class Product { //獲取產品方法 public abstract void getFood(); }
第二步:具體的啤酒飲料礦泉水食品類都需要繼承食品抽象類 Product
package pattern.simplenessfactory; /** * 具體啤酒類繼承自Product類 * @author ningbeibei * */ public class Berr extends Product { @Override public void getFood() { System.out.println("啤酒"); }; }
package pattern.simplenessfactory; /** * 具體飲料類繼承自Product * @author ningbeibei * */ public class Drinks extends Product { @Override public void getFood() { System.out.println("飲料"); } }
package pattern.simplenessfactory; /** * 具體礦泉水類繼承自Product * @author ningbeibei * */ public class Water extends Product { @Override public void getFood() { System.out.println("礦泉水"); } }
第三步:上面我們已經把產品類設計好了,現在開始創建食品加工廠Factory
食品加工工廠專門負責創建具體的食品對象並返回,大家看下面getCommodity(String type) 方法,這個方法是靜態方法,並且根據參數決定創建食品對象,方法內部通過邏輯判斷決定返回啤酒還是飲料或者是礦泉水,要注意的是:Product product = null; 這個變量用到的是java的特性繼承和多態,簡單說:子類對象父類型。
package pattern.simplenessfactory; /** * 食品加工工廠 * 根據需要專門負責生產各中食品,也就是專門創建各種所需對象 * @author ningbeibei */ public class Factory { //根據傳入參數返某個食品,也就是食品對象 public static Product getCommodity(String type) { //這個變量是抽象類,也就是食品類的父類 Product product = null; switch (type) { case "啤酒": product = new Berr(); break; case "飲料": product = new Drinks(); break; case "礦泉水": product = new Water(); break; } return product; } }
第四步:編寫測試類
package pattern.simplenessfactory; /** * 簡單工廠模式測試類 * @author ningbeibei */ public class test { public static void main(String[] args) { //通過工廠Factory類中的getCommodity()方法獲取啤酒對象 Factory.getCommodity("啤酒").getFood(); //通過工廠Factory類中的getCommodity()方法獲取飲料對象 Factory.getCommodity("飲料").getFood(); //通過工廠Factory類中的getCommodity()方法獲取礦泉水對象 Factory.getCommodity("礦泉水").getFood(); } }
五,思考題
現在我們來思考一個問題,如果我這個工廠隨着規模擴大業務提升,我現在不但要賣啤酒飲料礦泉水,我還要賣花生牛奶八寶粥,請問在現有簡單工廠模式下怎么擴展新產品?
六,思考題解答
如果簡單工廠要擴展新產品那么需要以下幾步:
(1),新增產品類並繼承Product類
package pattern.simplenessfactory; /** * 新增產品花生,繼承自Product類 * @author ningbeibei * */ public class Peanut extends Product { @Override public void getFood() { System.out.println("新增產品花生"); } }
(2),修改食品工廠Factory類中的邏輯判斷,添加新增產品花生邏輯判斷
package pattern.simplenessfactory; /** * 食品加工工廠 * 根據需要專門負責生產各中食品,也就是專門創建各種所需對象 * @author ningbeibei */ public class Factory { //根據傳入參數返某個食品,也就是食品對象 public static Product getCommodity(String type) { //這個變量是抽象類,也就是食品類的父類 Product product = null; switch (type) { case "啤酒": product = new Berr(); break; case "飲料": product = new Drinks(); break; case "礦泉水": product = new Water(); break; case "花生": product = new Peanut(); break; } return product; } }
現在我們發現我們竟然修改了食品工廠邏輯代碼,這對於一個大型項目來說,是有風險的,並且違背了設計模式開閉原則:簡單說明開閉原則,就是對擴展開放對修改封閉。
測試類
package pattern.simplenessfactory; /** * 簡單工廠模式測試類 * @author ningbeibei */ public class test { public static void main(String[] args) { //通過工廠Factory類中的getCommodity()方法獲取啤酒對象 Factory.getCommodity("啤酒").getFood(); //通過工廠Factory類中的getCommodity()方法獲取飲料對象 Factory.getCommodity("飲料").getFood(); //通過工廠Factory類中的getCommodity()方法獲取礦泉水對象 Factory.getCommodity("礦泉水").getFood(); //新增花生產品,通過工廠Factory類中的getCommodity()方法獲取花生對象 Factory.getCommodity("花生").getFood(); } }
運行結果
七,現在我們總結下簡單工廠模式的優缺店
優點:
- 工廠類含有必要的判斷邏輯,可以決定在什么時候創建哪一個產品類的實例,客戶端可以免除直接創建產品對象的責任,而僅僅“消費”產品;簡單工廠模式通過這種做法實現了對責任的分割,它提供了專門的工廠類用於創建對象。
- 客戶端無須知道所創建的具體產品類的類名,只需要知道具體產品類所對應的參數即可,對於一些復雜的類名,通過簡單工廠模式可以減少使用者的記憶量。
- 通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產品類,在一定程度上提高了系統的靈活性。
缺點:
- 由於工廠類集中了所有產品創建邏輯,一旦不能正常工作,整個系統都要受到影響。
- 使用簡單工廠模式將會增加系統中類的個數,在一定程序上增加了系統的復雜度和理解難度。
- 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,同樣破壞了“開閉原則”;在產品類型較多時,有可能造成工廠邏輯過於復雜,不利於系統的擴展和維護。
- 簡單工廠模式由於使用了靜態工廠方法,造成工廠角色無法形成基於繼承的等級結構。
八,java工廠模式學習思路
先簡單工廠模式===》而后工廠方法模式====》最后抽象工廠模式
學習就像打野要先打野區怪伺機偷小龍,最后搞大龍
由淺入深的學習在才能理解的更深更全面而后方能融會貫通
寫的不足之處望批評指正,我一定改