簡單工廠模式是最簡單的設計模式之一,雖然不屬于二十三種設計模式,但應用也較為頻繁,學習它也是學習其他創建型模式的基礎
模式動機
在實際軟體開發中,有時需創建一些來自于相同父類的類的實體,為此可以專門定義一個類來負責創建這些類的實體,這些被創建的實體具有共同的父類,習慣上將獲得其他類實體的方法定義為static方法,外部不需要實體化這個類就可以直接呼叫該方法獲得物件,該方法也稱為靜態工廠方法,
模式定義
簡單工廠模式又稱為靜態工廠方法模式,根據引數的不同回傳不同的型別的實體,簡單工廠模式專門定義一個類來負責創建其他類的實體,被創建的實體通常具有共同的父類,
模式結構

-
Factory(工廠角色)
簡單工廠模式的核心,負責實作創建所有實體的內部邏輯,工廠類可以被外界直接呼叫,創建所需的產品物件;工廠中提供了靜態的工廠方法,回傳一個抽象產品類 Product,所有的具體產品類都是抽象產品的具體實作
-
Product(抽象產品角色)
抽象產品角色是簡單工廠模式所創建的所有物件的父類,負責描述所有實體共有的公共介面
-
ConcreteProduct(具體產品角色)
具體產品角色是簡單工廠模式的創建目標,繼承了抽象產品角色,需要實作定義在抽象產品中的抽象方法
簡單工廠模式實體之手機工廠
-
實體說明
某手機廠專為各手機品牌生產手機,呼叫工廠的方法時傳入引數,則根據傳入的不同引數回傳不同品牌的手機,
-
實體類圖

-
實體代碼及解釋
-
抽象產品類Phone
public abstract class Phone { public abstract void use(); } -
具體產品類HuaweiPhone
public class HuaweiPhone extends Phone { @Override public void use() { System.out.println("華為手機使用中...."); } } -
具體產品類XiaomiPhone
public class XiaomiPhone extends Phone { @Override public void use() { System.out.println("小米手機使用中...."); } } -
工廠類PhoneFactory
public class PhoneFactory { public static Phone producePhone(String brand) { if(brand.equalsIgnoreCase("huawei")) { System.out.println("生產華為手機..."); return new HuaweiPhone(); } else if (brand.equalsIgnoreCase("xiaomi")) { System.out.println("生產小米手機"); return new XiaomiPhone(); } else { System.out.println("暫無該手機生產...."); return null; } } } -
組態檔
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!-- 通過從XML組態檔讀取節點獲取資料 --> <brandName>huawei</brandName> </configuration> -
XML操作工具類
public class XMLUtilPhone { public static String getBrandName() throws Exception { //創建決議器工廠 DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); //創建決議器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); //得到document Document document = builder.parse("configPhone.xml"); //獲取包含品牌名稱的文本節點 NodeList brandNameList = document.getElementsByTagName("brandName"); Node classNode = brandNameList.item(0).getFirstChild(); String brandName = classNode.getNodeValue().trim(); return brandName; } } -
測驗類
public class Test { public static void main(String[] args) throws Exception { String brandName = XMLUtilPhone.getBrandName(); Phone phone = PhoneFactory.producePhone(brandName); phone.use(); } } -
結果分析
如果在組態檔中將節點內容設定為huawei,則輸出結果為:

如果設定為vivo,則輸出結果為:

如果希望系統支持生產vivo牌手機,則需要添加一個新的具體類VivoPhone,同時還需要修改工廠中的方法,因此簡單工廠模式最大的問題在于工廠類的職責過于沉重,并且修改工廠類邏輯判斷這一點是與開閉原則相違背的,
-
模式優缺點
簡單工廠模式優點如下:
- 實作了對責任的分割,客戶免除直接創建產品物件的責任,而僅僅消費產品
- 通過引入組態檔,可以在不修改客戶端代碼的情況下更換和增加新的具體產品類,提高系統靈活性
簡單工廠模式缺點如下:
- 工廠類集中了所有產品的創建邏輯,一旦不能正常作業,整個系統都將受到影響
- 使用簡單工廠模式將增加系統中類的個數,在一定程度上增加系統的復雜度和理解難度
- 系統擴展困難,一旦添加新產品就不得不修改工廠邏輯,不利于系統維護
- 簡單工廠模式使用了靜態工廠方法,造成工廠角色無法形成基于繼承的等級結構
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/83410.html
標籤:其他
上一篇:一階LC諧振電路
