前言:
在简单工厂模式之后,进阶版当然就是工厂方法模式啦~,想看简单工厂方法模式,请看我的名为“设计模式之简单工厂模式01”的博客。
1.内容简述:
用工厂方法模式,实现用多种途径保存系统的运行日志,包括文件记录和数据库记录等。
2.实现过程:
(1).定义一个日志记录器接口Logger
package com.hnucm.wb.factorymethodlogger; public interface Logger { public void writeLog(); }
(2).定义具体产品角色,FileLogger和DatabaseLogger,实现Logger接口
package com.hnucm.wb.factorymethodlogger; public class FileLogger implements Logger{ @Override public void writeLog() { System.out.println("文件日志记录"); } }
package com.hnucm.wb.factorymethodlogger; public class DatabaseLogger implements Logger{ @Override public void writeLog() { System.out.println("数据库日志记录"); } }
(3).定义一个日志记录工厂接口LoggerFactory
package com.hnucm.wb.factorymethodlogger; public interface LoggerFactory { public Logger createLogger(); }
(4).定义具体工厂角色,FileLoggerFactory和DatabaseLoggerFactory,实现LoggerFactory接口
package com.hnucm.wb.factorymethodlogger; public class FileLoggerFactory implements LoggerFactory{ @Override public Logger createLogger() { Logger logger=new FileLogger(); return logger; } }
package com.hnucm.wb.factorymethodlogger; public class DatabaseLoggerFactory implements LoggerFactory{ @Override public Logger createLogger() { Logger logger=new DatabaseLogger(); return logger; } }
(5).将参数存入配置文件,使得在需要变换不同的方式时,无需修改源代码,只要修改配置文件即可。
<?xml version="1.0" encoding="UTF-8" ?> <config> <className>com.hnucm.wb.factorymethodlogger.FileLoggerFactory</className> </config>
package com.hnucm.wb.factorymethodlogger; 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; public class XMLUtils { public static Object getChartType() { try { DocumentBuilderFactory documentBuilderFactory=DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder= documentBuilderFactory.newDocumentBuilder(); Document document; document= (Document) documentBuilder.parse("D:\\Learner\\idea-example\\designPatterns\\src\\main\\java\\com\\hnucm\\wb\\factorymethodlogger\\config.xml"); NodeList nodeList=document.getElementsByTagName("className"); Node classNode=nodeList.item(0).getFirstChild(); String chartType=classNode.getNodeValue().trim(); Object obj=Class.forName(chartType).newInstance(); return obj; } catch (Exception e) { e.printStackTrace(); return null; } } }
(6). 定义一个客户测试类
package com.hnucm.wb.factorymethodlogger; public class Client { public static void main(String[] args){ LoggerFactory loggerFactory; Logger logger; loggerFactory=(LoggerFactory) XMLUtils.getChartType();//创建日志文件工厂 logger=loggerFactory.createLogger();//创建日志文件对象 logger.writeLog(); } }
(7).运行结果