Menu
CoddyTech

回顾:日志记录器工厂

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 57 课,共 61 课。

challenge icon

挑战

简单

让我们来构建一个日志记录器工厂:这个系统展示了将工厂模式与多态结合起来的强大之处。工厂会根据配置标志创建不同的日志记录器实现,让代码无需改变日志记录器的使用方式,就能在详细的控制台输出和静默的“dummy”日志记录之间切换。

你会将代码分成三个文件:

  • logger.h:定义一个充当接口的 Logger 结构体。它应包含一个 log 函数指针,该函数接收一个 Logger* 和一条 const char* 消息。声明工厂函数 create_logger,它接收一个整数标志(1 表示控制台,0 表示 dummy),并返回一个 Logger*。此外,还要声明用于清理的 free_logger 函数。
  • logger.c:实现两种具体的日志记录器类型。ConsoleLogger 将 Logger 作为其第一个成员,并有一个以 [LOG] message 格式打印消息的日志函数。DummyLogger 同样将 Logger 作为其第一个成员,但它的日志函数不执行任何操作,只会直接返回,不打印内容。为每种类型创建构造函数,分配内存并设置相应的日志函数。然后将 create_logger 实现为一个工厂,根据标志检查结果,以 Logger* 的形式返回相应的日志记录器类型。实现 free_logger 来释放内存。
  • main.c:读取一个整数(1 或 0),以确定要创建哪种日志记录器。使用工厂创建相应的日志记录器,然后调用它的 log 函数,传入两条消息:"Starting application" 和 "Shutting down"。最后,释放日志记录器。

程序会收到一个输入:表示日志记录器类型的整数(1 表示控制台,0 表示 dummy)。

输入为 1 时的输出示例:

[LOG] Starting application
[LOG] Shutting down

输入为 0 时的输出示例:

(没有输出:dummy 日志记录器会静默地忽略所有消息)

这种设计的优雅之处在于,无论 main.c 收到哪种类型的日志记录器,它的使用方式都完全相同。工厂负责决定创建什么,而多态则确保执行正确的行为。在实际应用中,这种模式非常有用,例如,你可能希望在开发期间进行详细的日志记录,而在生产环境中静默运行。

亲手试试

#include <stdio.h>
#include "logger.h"

int main() {
    // 读取 logger 类型标志(1 表示控制台,0 表示空操作)
    int flag;
    scanf("%d", &flag);
    
    // TODO: 使用工厂创建合适的 logger
    
    // TODO: 使用 "Starting application" 调用 logger 的 log 函数
    
    // TODO: 使用 "Shutting down" 调用 logger 的 log 函数
    
    // TODO: 释放 logger
    
    return 0;
}

面向对象编程中的所有课

自己练习: C 在线编译器