軟件設計模式系列——簡單工廠模式


一、定義

簡單工廠模式,又稱為靜態方法模式,屬於類創建型的模式,可以根據參數的不同返回不同的類的實例。

二、類圖

三、適用的環境

(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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM