• 工厂方法模式


    工厂方法模式

    原文链接: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;
    }
    
    }
  • 相关阅读:
    讨论下NOSQLDB使用场景的问题
    控制反转IOC与依赖注入DI dodo
    ASp.net中Froms验证方式 dodo
    SQL Server 2008阻止保存要求重新创建表的更改 dodo
    依赖注入容器Unity介绍 dodo
    mvc UrlHelper dodo
    ASP.NET MVC 使用TempData dodo
    ASP.NET MVC的生命周期与网址路由 dodo
    强制将IE,Chrome设置为指定兼容模式来解析 dodo
    LINQ to XML 常用操作(转) dodo
  • 原文地址:https://www.cnblogs.com/free-discipline/p/12867612.html
Copyright © 2020-2023  润新知