簡單工廠模式
簡單工廠模式是最簡單的設計模式之一,雖然不屬於二十三種設計模式,但應用也較爲頻繁。學習它也是學習其他創建型模式的基礎
模式定義
在實際軟件開發中,有時需創建一些來自於相同父類的類的實例,爲此可以專門定義一個類來負責創建這些類的實例,這些被創建的實例具有共同的父類。習慣上將獲得其他類實例的方法定義爲static方法,外部不需要實例化這個類就可以直接調用該方法獲得對象,該方法也稱爲靜態工廠方法。
簡單工廠模式又稱爲靜態工廠方法模式,根據參數的不同返回不同的類型的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常具有共同的父類。
簡單工廠模式實例之手機工廠
-
實例代碼及解釋
-
抽象產品類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,同時還需要修改工廠中的方法。因此簡單工廠模式最大的問題在於工廠類的職責過於沉重,並且修改工廠類邏輯判斷這一點是與開閉原則相違背的。
-