回顾:日志记录器工厂
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 57 课,共 61 课。
挑战
简单让我们来构建一个日志记录器工厂:这个系统展示了将工厂模式与多态结合起来的强大之处。工厂会根据配置标志创建不同的日志记录器实现,让代码无需改变日志记录器的使用方式,就能在详细的控制台输出和静默的“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 在线编译器