完整案例分析再加知識整合——艾特工廠方法模式,超詳細的

  • 2020 年 3 月 28 日
  • 筆記

工廠方法模式

模式動機與定義

模式動機

 

 

模式定義

  • 工廠方法模式(Factory Method Pattern)簡稱工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式,它屬於類創建型模式。
  • 在工廠方法模式中,工廠父類負責定義創建產品對象的公共介面,而工廠子類則負責生成具體的產品對象,這樣做的目的是將產品類的實例化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該實例化哪一個具體產品類

模式結構與分析

模式結構

 

 

工廠方法模式包含如下角色:

  • Product:抽象產品
  • ConcreteProduct:具體產品
  • Factory:抽象工廠
  • ConcreteFactory:具體工廠

模式分析

  • 工廠方法模式是簡單工廠模式的進一步抽象和推廣
  • 工廠方法模式保持了簡單工廠模式的優點,並克服了它的缺點
  • 核心的工廠類不再負責所有產品的創建,而是將具體創建工作交給其子類去完成
  • 可以允許系統在不修改工廠角色的情況下引進新產品
  • 增加具體產品–>增加具體工廠,符合“開閉原則”

Java反射機制的應用

 

 

配置文件的應用

 

 

工具類XMLUtil程式碼片段

 

 

模式實例與解析

模式實例

電視機工廠:實例說明

  • 將原有的電視機工廠進行分割,為每種品牌的電視機提供一個子工廠,海爾工廠專門負責生產海爾電視機,海信工廠專門負責生產海信電視機,如果需要生產TCL電視機或創維電視機,只需要對應增加一個新的TCL工廠或創維工廠即可,原有的工廠無需做任何修改,使得整個系統具有更好的靈活性和可擴展性。

電視機工廠:參考類圖

 

 

電視機工廠:參考程式碼

程式碼結構:

 

 

TV介面

package factorymethod;    public interface TV {      public void play();  }

HaierTV類

package factorymethod;    public class HaierTV implements TV {      @Override      public void play() {          System.out.println("海爾電視機播放中···");      }  }

HisenseTV類

package factorymethod;    public class HisenseTV implements TV {      @Override      public void play() {          System.out.println("海信電視機播放中···");      }  }

TVFactory介面

package factorymethod;    public interface TVFactory {      public TV produceTV();  }

HaierTVFactory類

package factorymethod;    public class HaierTVFactory implements TVFactory {      @Override      public TV produceTV() {          System.out.println("海爾電視機工廠生產海爾電視機!");          return new HaierTV();      }  }

HisenseTVFactory類

package factorymethod;    public class HisenseTVFactory implements TVFactory {      @Override      public TV produceTV() {          System.out.println("海信電視機工廠生產海信電視機!");          return new HisenseTV();      }  }

FactoryMethodconfig.xml

<?xml version="1.0" encoding="UTF-8"?>  <config>      <className>factorymethod.HisenseTVFactory</className>        <!--<className>factorymethod.HaierTVFactory</className>-->  </config>

XMLUtil類

package factorymethod;    import org.w3c.dom.Document;  import org.w3c.dom.Node;  import org.w3c.dom.NodeList;    import javax.xml.parsers.DocumentBuilder;  import javax.xml.parsers.DocumentBuilderFactory;  import java.io.File;    public class XMLUtil {        //該方法用於從XML配置文件中提取具體類類名,並返回一個實例對象      public static Object getBean(){          try {              //創建文檔對象              DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();              DocumentBuilder builder = dFactory.newDocumentBuilder();              Document doc;                doc = builder.parse(new File("D:\MyNewWorld\Study_JAVA\MyHome\Write_java\My_Maven\src\main\resources\FactoryMethodconfig.xml"));                  //獲取包含類名的文本節點              NodeList n1 = doc.getElementsByTagName("className");              Node classNode = n1.item(0).getFirstChild();                String cName = classNode.getNodeValue();                //通過類名生成實例對象並將其返回              Class c = Class.forName(cName);              Object obj = c.newInstance();              return obj;          } catch (Exception e) {              e.printStackTrace();              return null;          }      }  }

Client類

package factorymethod;    public class Client {      public static void main(String[] args) {          try {              TV tv;              TVFactory factory;              factory = (TVFactory) XMLUtil.getBean();              tv = factory.produceTV();              tv.play();          }catch (Exception e){              System.out.println(e.getMessage());          }      }  }

運行結果

 

 

 

 

 

 

 

 

模式效果與應用

工廠方法模式優點

  • 工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節
  • 能夠讓工廠自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部。
  • 在系統中加入新產品時,完全符合開閉原則

工廠方法模式缺點

  • 系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,會給系統帶來一些額外的開銷。
  • 增加了系統的抽象性和理解難度

在以下情況下可以使用工廠方法模式:

  • 客戶端不知道它所需要的對象的類(客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體產品對象由具體工廠類創建)
  • 抽象工廠類通過其子類來指定創建哪個對象