zoukankan      html  css  js  c++  java
  • 工厂方法模式

    工厂方法模式

    原文链接: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;
    }
    
    }
  • 相关阅读:
    记Java程序Log4J漏洞的解决过程
    IIS中应用程序池自动停止,重启报错
    如何查看域名所对应的证书有效期?
    查看前端Vue版本命令
    WCF中常见的报错:The content type text
    dotnet 将自动代码格式化机器人带入团队 GitLab 平台
    WPF 引用第三方库的控件在设计器加上设计时数据和属性
    dotnet OpenXML 聊聊文本段落对齐方式
    WPF 布局 在有限空间内让两个元素尽可能撑开的例子
    dotnet 通过 DockerfileContext 解决项目放在里层文件夹导致 VisualStudio 构建失败
  • 原文地址:https://www.cnblogs.com/free-discipline/p/12867612.html
Copyright © 2011-2022 走看看