簡單工廠模式是最簡單的設計模式之一,雖然不屬於二十三種設計模式,但應用也較爲頻繁。學習它也是學習其餘建立型模式的基礎java
在實際軟件開發中,有時需建立一些來自於相同父類的類的實例,爲此能夠專門定義一個類來負責建立這些類的實例,這些被建立的實例具備共同的父類。習慣上將得到其餘類實例的方法定義爲static方法,外部不須要實例化這個類就能夠直接調用該方法得到對象,該方法也稱爲靜態工廠方法。設計模式
簡單工廠模式又稱爲靜態工廠方法模式,根據參數的不一樣返回不一樣的類型的實例。簡單工廠模式專門定義一個類來負責建立其餘類的實例,被建立的實例一般具備共同的父類。ide
某手機廠專爲各手機品牌生產手機,調用工廠的方法時傳入參數,則根據傳入的不一樣參數返回不一樣品牌的手機。工具
抽象產品類Phone學習
public abstract class Phone { public abstract void use(); }
具體產品類HuaweiPhone測試
public class HuaweiPhone extends Phone { @Override public void use() { System.out.println("華爲手機使用中...."); } }
具體產品類XiaomiPhoneui
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; } } }
配置文件code
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!-- 經過從XML配置文件讀取節點獲取數據 --> <brandName>huawei</brandName> </configuration>
XML操做工具類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,同時還須要修改工廠中的方法。所以簡單工廠模式最大的問題在於工廠類的職責過於沉重,而且修改工廠類邏輯判斷這一點是與開閉原則相違背的。