zoukankan      html  css  js  c++  java
  • 工厂三兄弟之工厂方法模式(三)

    3 完整解决方案

            Sunny公司开发人员决定使用工厂方法模式来设计日志记录器,其基本结构如图3所示:

    3 日志记录器结构图

           在图3中,Logger接口充当抽象产品,其子类FileLogger和DatabaseLogger充当具体产品,LoggerFactory接口充当 抽象工厂,其子类FileLoggerFactory和DatabaseLoggerFactory充当具体工厂。完整代码如下所示:

    1. //日志记录器接口:抽象产品  
    2. interface Logger  
    3.     public void writeLog();  
    4.  
    5.   
    6. //数据库日志记录器:具体产品  
    7. class DatabaseLogger implements Logger  
    8.     public void writeLog()  
    9.         System.out.println("数据库日志记录。");  
    10.      
    11.  
    12.   
    13. //文件日志记录器:具体产品  
    14. class FileLogger implements Logger  
    15.     public void writeLog()  
    16.         System.out.println("文件日志记录。");  
    17.      
    18.  
    19.   
    20. //日志记录器工厂接口:抽象工厂  
    21. interface LoggerFactory  
    22.     public Logger createLogger();  
    23.  
    24.   
    25. //数据库日志记录器工厂类:具体工厂  
    26. class DatabaseLoggerFactory implements LoggerFactory  
    27.     public Logger createLogger()  
    28.             //连接数据库,代码省略  
    29.             //创建数据库日志记录器对象  
    30.             Logger logger new DatabaseLogger();   
    31.             //初始化数据库日志记录器,代码省略  
    32.             return logger;  
    33.         
    34.  
    35.   
    36. //文件日志记录器工厂类:具体工厂  
    37. class FileLoggerFactory implements LoggerFactory  
    38.     public Logger createLogger()  
    39.             //创建文件日志记录器对象  
    40.             Logger logger new FileLogger();   
    41.             //创建文件,代码省略  
    42.             return logger;  
    43.         
    44.  

           编写如下客户端测试代码:

    1. class Client  
    2.     public static void main(String args[])  
    3.         LoggerFactory factory;  
    4.         Logger logger;  
    5.         factory new FileLoggerFactory(); //可引入配置文件实现  
    6.         logger factory.createLogger();  
    7.         logger.writeLog();  
    8.      
    9.  

           编译并运行程序,输出结果如下:

    文件日志记录。

     

    4 反射与配置文件

           为了让系统具有更好的灵活性和可扩展性,Sunny公司开发人员决定对日志记录器客户端代码进行重构,使得可以在不修改任何客户端代码的基础上更换或增加新的日志记录方式。

           在客户端代码中将不再使用new关键字来创建工厂对象,而是将具体工厂类的类名存储在配置文件(如XML文件)中,通过读取配置文件获取类名字符串,再使用Java的反射机制,根据类名字符串生成对象。在整个实现过程中需要用到两个技术:Java反射机制与配置文件读取。软件系统的配置文件通常为XML文件,我们可以使用DOM (Document Object Model)SAX (Simple API for XML)StAX (Streaming API for XML)等技术来处理XML文件。关于DOMSAXStAX等技术的详细学习大家可以参考其他相关资料,在此不予扩展。

    微笑

    扩展

    关于JavaXML的相关资料,大家可以阅读Tom MyersAlexander Nakhimovsky所著的《Java XML编程指南》一书或访问developer Works 中国中的“Java XML 技术专题”,参考链接:

    http://www.ibm.com/developerworks/cn/xml/theme/x-java.html

           Java反射(Java Reflection)是指在程序运行时获取已知名称的类或已有对象的相关信息的一种机制,包括类的方法、属性、父类等信息,还包括实例的创建和实例类型的判断等。在反射中使用最多的类是ClassClass类的实例表示正在运行的Java应用程序中的类和接口,其forName(String className)方法可以返回与带有给定字符串名的类或接口相关联的 Class对象,再通过Class对象的newInstance()方法创建此对象所表示的类的一个新实例,即通过一个类名字符串得到类的实例。如创建一个字符串类型的对象,其代码如下:

    1. //通过类名生成实例对象并将其返回  
    2. Class c=Class.forName("String");  
    3. Object obj=c.newInstance();  
    4. return obj;  

           此外,在JDK中还提供了java.lang.reflect包,封装了其他与反射相关的类,此处只用到上述简单的反射代码,在此不予扩展。

           Sunny公司开发人员创建了如下XML格式的配置文件config.xml用于存储具体日志记录器工厂类类名:

    1. >  
  • 相关阅读:
    ELK Packetbeat 部署指南
    ELK beats平台介绍
    ELK Packetbeat 部署指南(15th)
    什么是staging server
    elasticsearch学习一、安装和配置
    How To Use Logstash and Kibana To Centralize Logs On CentOS 6
    Java字节码(.class文件)格式详解(一)
    JVM之字节码——Class文件格式
    如何获得JVM执行过程中调用的方法名
    ELK beats通用配置说明(12th)
  • 原文地址:https://www.cnblogs.com/luckForever/p/7254924.html
Copyright © 2011-2022 走看看