工厂方法模式设计实验

【实验内容】

楚锋软件公司欲开发一个系统运行日志记录器(Logger)。该记录器可以通过多种途径保存系统的运行日志:例如通过文件记录或数据库记录,用户可以通过修改配置文件灵活地更换日志记录方式。在设计各类日志记录器时,楚锋软件公司的开发人员发现需要对日志记录器进行一些初始化工作,初始化参数的设置过程较为复杂,而且某些参数的设置有严格的先后次序,否则可能会发生记录失败。如何封装记录器的初始化过程并保证多种记录器切换的灵活性是楚锋软件公司开发人员面临的一个难题。

楚锋软件公司的开发人员通过对该需求进行分析,发现该日志记录器有两个设计要点:

(1)需要封装日志记录器的初始化过程,这些初始化工作较为复杂,例如需要初始化其他相关的类,还有可能需要配置工作环境(例如连接数据库或创建文件),导致代码较长,如果将它们都写在构造函数中,会导致构造函数庞大,不利于代码的修改和维护。

(2)用户可能需要更换日志记录方式,在客户端代码中需要提供一种灵活的方式来选择日志记录器,尽量在不修改源代码的基础上更换或者增加日志记录方式。

楚锋软件公司发人员最初使用简单工厂模式对日志记录器进行了设计,初始结构如下图所示。

在上图所示的设计中:

LoggerFactory 充当创建日志记录器的工厂,提供了工厂方法 createLogger() 用于创建日志记录器,Logger 是抽象日志记录器接口,其子类为具体日志记录器。上面设计对应的代码如下:

为了突出设计重点,上述代码进行了简化,省略了具体日志记录器类的初始化代码。在 LoggerFactory 类中提供了静态工厂方法 createLogger() ,用于根据所传入的参数创建各种不同类型的日志记录器。通过使用简单工厂模式,将日志记录器对象的创建和使用分离,客户端只需使用由工厂类创建的日志记录器对象即可,无须关心对象的创建过程但是,虽然简单工厂模式实现了对象的创建和使用分离,仍然存在以下两个问题:

(1)工厂类过于庞大,包含了大量的 if···ese··· 代码,导致维护和测试难度增大

(2)系统扩展不灵活,如果增加新类型的日志记录器,必须修改静态工厂方法的业务逻辑,违反了开闭原则。

【实验要求】

使用工厂模式重构上面的设计,解决上面两个问题。给出设计类图,以及对应的 Java 代码

【实验答案参考】

UML设计类图:

Java代码:

java 复制代码
public interface LoggerFactory {

    public Logger createLogger();

}



 public class FileLoggerFactory implements LoggerFactory {

    public Logger createLogger(){        

        //创建文件日志记录器对象

        Logger logger = new FileLogger();

        //创建文件,代码省略

        return logger;

    }

}



public class DatabaseLoggerFactory implements LoggerFactory {

    public Logger createLogger(){

        //连接数据库,代码省略

        //创建数据库日志记录器对象

        Logger logger = new DatabaseLogger();

        //初始化数据库日志记录器,代码省略

        return logger;

    }

}



public class Client {

    public static void main(String args[]){        

        LoggerFactory factory;

        Logger logger;

        //下面也可以通过引入配置文件实线类工厂的指定

        factory=new FileLoggerFactory();

        logger=factory.createLogger();

        logger.writeLog();

    }

}
相关推荐
水云桐程序员4 小时前
C++可以写手机应用吗
开发语言·c++·智能手机
测试员周周4 小时前
【AI测试智能体】为什么传统测试方法对智能体失效?
开发语言·人工智能·python·功能测试·测试工具·单元测试·测试用例
RSTJ_16255 小时前
PYTHON+AI LLM DAY THREETY-NINE
开发语言·人工智能·python
想学习java初学者5 小时前
SpringBoot整合Vertx-Mqtt多租户(优化版)
java·spring boot·后端
AC赳赳老秦5 小时前
政企内网落地:OpenClaw 离线环境深度适配方案,无外网场景下本地化模型对接与全功能使用
java·大数据·运维·python·自动化·deepseek·openclaw
赏金术士5 小时前
Kotlin 从入门到进阶 之函数模块(核心基础)(二)
android·开发语言·kotlin
weixin_449173655 小时前
在 Java 中,‌线程安全的 List‌ 主要有以下几种实现方式,它们的效率取决于具体的使用场景(尤其是读写比例):
java·线程安全的list
砚底藏山河6 小时前
股票数据API接口:如何获取股票历历史分时KDJ数据
java·python·maven
MegaDataFlowers7 小时前
运行若依项目
java
加号37 小时前
【Qt】 应用程序发布:依赖库拷贝与部署指南
开发语言·qt