工廠方法模式java
原文連接:https://blog.csdn.net/qq_42428264/article/details/90721656數據庫
原文很nice想了解更多,建議看看dom
1、工廠方法實現工具
1. 建立用於實現具體業務對象的接口測試
package com.test; public interface Logger { public void writeLog(); }
2. 建立兩個業務對象,都實現Logger接口ui
2.1 數據日誌業務spa
package com.test; //數據日誌 public class DatabaseLogger implements Logger { public void writeLog() { System.out.println("數據庫日誌記錄"); }
2.2 文件日誌業務.net
package com.test; public class FileLogger implements Logger { public void writeLog() { System.out.printin("文件日誌記錄"); } }
3. 建立實現業務工廠的接口或抽象類日誌
package com.test; public interface LoggerFactory { public Logger createLogger(); // 抽象工廠方法 }
4. 建立兩個實現業務對象的工廠對象code
4.1 建立數據日誌業務對象的工廠類
package com.test; public class DatabaseLoggerFactory implements LoggerFactory { public Logger createLogger(){ //鏈接數據庫,代碼省略 //建立數據庫日誌記錄器對象 Logger logger= new DatabaseLogger(); //初始化數據庫日誌記錄器,代碼省略 return logger; } }
4.2 建立文件日誌業務對象的工廠類
package com.test; public class FileLoggerFactory implements LoggerFactory{ public Logger createlogger() { // 建立文件日誌記錄器對象 Logger logger= new FileLogger(); //建立文件,代碼省略 return logger; } }
5. 客戶測試類
package com.test; public class Client { public static vold main(string []args){ LoggerFactory factory; Logger logger; factory = new FileloggerFactory();//可引入配置文件和反射機制實現 logger = factory.createlogger(); logger.writeLog(); } }
2、工廠方法的缺點與優勢
缺點:
1. 增長了系統的複雜度,有更多的類須要編譯和運行,會給系統帶來一些額外的開銷。
2. 增長了系統的抽象性和理解難度。
優勢:
1. 系統的可擴展性好,徹底符合開閉原則。
3、拓展
1. 客戶端隱藏工廠方法結構圖
2.經過config.xml配置文件調用日誌
XMLUtil工具類
package com.test; import java.io.IOException; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class XMLUtil { public static Object getBean() { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); Document document = builder.parse("src/design/config.xml"); // 獲取包含類名的文本節點 NodeList list = document.getElementsByTagName("className"); Node classNode = list.item(0).getFirstChild(); String cName = classNode.getNodeValue().trim(); Class c = Class.forName(cName); Object obj = c.newInstance(); return obj; } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }