一、定義
簡單工廠模式,又稱為靜態方法模式,屬於類創建型的模式,可以根據參數的不同返回不同的類的實例。
二、類圖
三、適用的環境
(1)工廠類創建的對象比較小,這樣不會造成工廠方法中業務的邏輯過於復雜。
(2)客戶端只是知道傳入工廠類的參數、對於如何去創建對象並不關心。客戶端不需要去關心創建的細節,只需要明確需要的參數,而由工廠內部負責具體的類的創建。
四、優點
(1)責任分割:工廠類含有處理邏輯,決定何時去創建產品對象,客戶端只是需要傳遞對應的參數,即可以完成產品的創建。
(2)在一定程度上提高了系統的靈活性:可以通過引入配置文件的方法,在不去修改客戶端代碼的前提下,更換和增減新的產品。
五、缺點
(1)工廠類中集中了所有的判斷處理邏輯,是整個系統的核心。
(2)系統拓展困難,如果去添加新的產品就不得不去修改工廠的邏輯,在產品類型較多時,需要修改工廠的內部邏輯,不利於系統的拓展和維護。
六、程序實例
(1)產品接口
1 package SimpleFactoryPattern; 2 3 /** 4 * @author jiaqing.xu@hand-china.com 5 * @version 1.0 6 * @name 7 * @description 抽象的TV類 8 * @date 2017/10/19 9 */ 10 public interface TV { 11 /** 12 * 電視機播放的方法 13 */ 14 public void play(); 15 }
(2)具體的電視類實現抽象接口
1 package SimpleFactoryPattern; 2 3 /** 4 * @author jiaqing.xu@hand-china.com 5 * @version 1.0 6 * @name 7 * @description 具體的電視類 海爾電視機 8 * @date 2017/10/19 9 */ 10 public class HaierTV implements TV { 11 @Override 12 public void play() { 13 System.out.println("海爾電視機播放中..."); 14 } 15 }
1 package SimpleFactoryPattern; 2 3 /** 4 * @author jiaqing.xu@hand-china.com 5 * @version 1.0 6 * @name 7 * @description 8 * @date 2017/10/19 9 */ 10 public class HisenseTV implements TV { 11 @Override 12 public void play() { 13 System.out.println("海信電視機播放中..."); 14 } 15 }
(3)產品工廠根據傳入的參數的不同去實例化出不同的產品
1 package SimpleFactoryPattern; 2 3 /** 4 * @author jiaqing.xu@hand-china.com 5 * @version 1.0 6 * @name 7 * @description 電視機工廠 8 * @date 2017/10/19 9 */ 10 public class TVFactory { 11 /** 12 * 13 * @param brand 14 * @return 15 * @description 根據不同的brand去生成不同的TV 16 */ 17 public static TV produceTV(String brand) throws Exception { 18 //生產Haier電視機 19 if(brand.equalsIgnoreCase("Haier")){ 20 System.out.println("生產了一個Haier電視機."); 21 return new HaierTV(); 22 }else if(brand.equalsIgnoreCase("Hisense")){ 23 System.out.println("生產了一個Hisense電視機."); 24 return new HisenseTV(); 25 }else{ 26 throw new Exception("對不起,還不能生產該類型的電視機."); 27 } 28 } 29 }
(4)解析xml文件的工具類
1 package SimpleFactoryPattern; 2 3 import org.w3c.dom.Document; 4 import org.w3c.dom.Node; 5 import org.w3c.dom.NodeList; 6 import org.xml.sax.SAXException; 7 8 import javax.xml.parsers.DocumentBuilder; 9 import javax.xml.parsers.DocumentBuilderFactory; 10 import javax.xml.parsers.ParserConfigurationException; 11 import java.io.File; 12 import java.io.IOException; 13 14 /** 15 * @author jiaqing.xu@hand-china.com 16 * @version 1.0 17 * @name 18 * @description 19 * @date 2017/10/19 20 */ 21 public class XMLUtilTV { 22 /** 23 * 從xml中獲取品牌的名稱並返回該品牌名稱 24 */ 25 public static String getBrandName() throws ParserConfigurationException, IOException, SAXException { 26 //創建文檔對象讀取工廠 27 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 28 DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); 29 Document doc; 30 doc = builder.parse(new File("configTV.xml")); 31 32 //獲取對應的文本節點 33 NodeList nodeList = doc.getElementsByTagName("brandName"); 34 Node classNode = nodeList.item(0).getFirstChild(); 35 String brandName = classNode.getNodeValue().trim(); 36 return brandName; 37 } 38 }
(5)config文件
1 <?xml version="1.0"?> 2 <config> 3 <brandName>Haier</brandName> 4 </config>
(6)測試方法
1 package SimpleFactoryPattern; 2 3 /** 4 * @author jiaqing.xu@hand-china.com 5 * @version 1.0 6 * @name 7 * @description 測試方法 8 * @date 2017/10/19 9 */ 10 public class Test { 11 public static void main(String[] args) throws Exception { 12 TV tv; 13 String brandName = XMLUtilTV.getBrandName(); 14 //傳入品牌名稱 生產電視機 15 tv = TVFactory.produceTV(brandName); 16 tv.play(); 17 } 18 }