完整案例分析再加知識整合——艾特工廠方法模式,超詳細的
阿新 • • 發佈:2020-03-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()); } } }
執行結果
模式效果與應用
工廠方法模式優點
- 工廠方法用來建立客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被例項化這一細節
- 能夠讓工廠自主確定建立何種產品物件,而如何建立這個物件的細節則完全封裝在具體工廠內部。
- 在系統中加入新產品時,完全符合開閉原則
工廠方法模式缺點
- 系統中類的個數將成對增加,在一定程度上增加了系統的複雜度,會給系統帶來一些額外的開銷。
- 增加了系統的抽象性和理解難度。
在以下情況下可以使用工廠方法模式:
- 客戶端不知道它所需要的物件的類(客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體產品物件由具體工廠類建立)
- 抽象工廠類通過其子類來指定建立哪個物件
&n