工厂方法模式
原文链接:https://blog.csdn.net/qq_42428264/article/details/90721656
原文很nice想了解更多,建议看看
一、工厂方法实现
1. 创建用于实现具体业务对象的接口
package com.test; public interface Logger { public void writeLog(); }
2. 创建两个业务对象,都实现Logger接口
2.1 数据日志业务
package com.test; //数据日志 public class DatabaseLogger implements Logger { public void writeLog() { System.out.println("数据库日志记录"); }
2.2 文件日志业务
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. 创建两个实现业务对象的工厂对象
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(); } }
二、工厂方法的缺点与优点
缺点:
1. 增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。
2. 增加了系统的抽象性和理解难度。
优点:
1. 系统的可扩展性好,完全符合开闭原则。
三、拓展
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; } }