工厂方法模式

工厂方法模式

原文链接: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;
}

}
原文地址:https://www.cnblogs.com/free-discipline/p/12867612.html