实验二-工厂模式实验
一、实验目的
1、熟悉工厂模式的概念;
2、掌握工厂模式的四个角色和基本结构;
3、掌握工厂模式的实现;
4、理解工厂模式的应用场景;
二、 实验原理
1、工厂模式的原理
工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
2、工厂模式的4个角色
Product
(抽象产品)
ConcreteProduct
(具体产品)
Factory
(抽象工厂)
ConcreteFactory
(具体工厂)
3、工厂模式的基本结构如下图:
三、 实验内容
某系统运行日志记录器(Logger
)可以通过多种途径保存系统的运行日志,例如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。
为了更好地封装记录器的初始化过程并保证多种记录器切换的灵活性,现使用工厂方法模式设计该系统。(注:在.NET平台下常用的日志记录工具有 Log4net
、NLog
等,.NET Framework
也提供了一些用于记录日志的类,例如 Debug
、Trace
、TraceSource
等。)
[实验步骤]
(1) 分析案例,采用工厂模式设计类图,确定四个工厂模式的四个角色。
分析得到如下类图:
(3) 分析得到如下七个类:
Logger
:日志记录器接口,充当抽象产品角色
DatabaseLogger
:数据库日志记录器,充当具体产品角色
FileLogger
:文件日志记录器,充当具体产品角色
LoggerFactory
:日志记录器工厂接口,充当抽象工厂角色
DatabaseLoggerFactory
:数据库日志记录器工厂类,充当具体工厂角色
FileLoggerFactory
:文件日志记录器工厂类,充当具体工厂角色
Program
:客户端测试类
(4) 完成全部代码,编译并运行结果。
(5) 给出配置文件并修改测试类
实验结果
画出的UML如下图所示:
config.xml
<?xml version="1.0" encoding="utf-8" ?>
<config>
<className>factoryMethod.FileLoggerFactory</className>
</config>
XMLUtils.java
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 {
public static Object getBean(){
try {
//1.创建一个DOM文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("src//factoryMethod//config.xml"));
//2.读取文档节点数据
NodeList nodeList = document.getElementsByTagName("className");
Node node = nodeList.item(0).getFirstChild();
String cName = node.getNodeValue();
//3.返回文档对象
Class c = Class.forName(cName);
Object object=c.newInstance();
return object;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
DatabaseLogger.java
package factoryMethod;
public class DatabaseLogger implements Logger {
public DatabaseLogger(){
}
public void finalize() throws Throwable {
}
public void writeLog(){
System.out.println("数据库日志记录");
}
}
DatabaseLoggerFactory.java
package factoryMethod;
public class DatabaseLoggerFactory implements LoggerFactory {
public DatabaseLoggerFactory(){
}
public void finalize() throws Throwable {
}
public Logger createLogger(){
Logger logger = new DatabaseLogger();
return logger;
}
}
FileLogger.java
package factoryMethod;
public class FileLogger implements Logger {
public FileLogger(){
}
public void finalize() throws Throwable {
}
public void writeLog(){
System.out.println("文件日志记录");
}
}
FileLoggerFactory.java
package factoryMethod;
public class FileLoggerFactory implements LoggerFactory {
public FileLoggerFactory(){
}
public void finalize() throws Throwable {
}
public Logger createLogger(){
Logger logger = new FileLogger();
return logger;
}
}
Logger.java(接口)
package factoryMethod;
public interface Logger {
public void writeLog();
}
LoggerFactory.java(接口)
package factoryMethod;
public interface LoggerFactory {
public Logger createLogger();
}
Client.java(测试类)
package factoryMethod;
public class Client {
public static void main(String[] args){
LoggerFactory factory;
Logger logger;
factory=(LoggerFactory)XMLUtil.getBean();
// factory = new DatabaseLoggerFactory();
// factory = new FileLoggerFactory();
logger = factory.createLogger();
logger.writeLog();
}
public void finalize() throws Throwable {
}
}
// 输出结果:文件日志记录
评论区