Menu
Coddy logo textTech

Итоги: Logger Factory

Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 57 из 61.

challenge icon

Задание

Легко

Давайте создадим Logger Factory: систему, демонстрирующую возможности объединения паттерна Factory с полиморфизмом. Ваша factory будет создавать различные реализации logger на основе конфигурационного flag, позволяя коду переключаться между подробным выводом в консоль и тихим журналированием через "dummy" без изменения способа использования logger.

Вы организуете код в трёх файлах:

  • logger.h: Define структуру Logger, которая acts как интерфейс. Она должна содержать указатель на function для log, принимающую Logger* и сообщение const char*. Объявите вашу factory function create_logger, которая принимает integer flag (1 для консоли, 0 для dummy) и возвращает Logger*. Также объявите function free_logger для очистки.
  • logger.c: Implement два конкретных типа logger. ConsoleLogger встраивает Logger в качестве своего first члена и имеет function log, которая выводит сообщения в формате [LOG] message. DummyLogger также встраивает Logger, но его function log ничего не делает. Она просто возвращает управление, не выполняя вывод. Создайте constructor functions для каждого типа, которые выделяют память и подключают appropriate function log. Затем Implement create_logger как factory, которая проверяет flag и возвращает appropriate тип logger как Logger*. Implement free_logger для освобождения памяти.
  • main.c: Считайте integer (1 или 0), чтобы определить, какой logger создать. Используйте вашу factory, чтобы создать appropriate logger, затем вызовите его function log с двумя сообщениями: "Starting application" и "Shutting down". Наконец, освободите logger.

Ваша программа получит один входной параметр: integer, указывающий тип logger (1 для консоли, 0 для dummy).

Пример вывода, если входное значение равно 1:

[LOG] Starting application
[LOG] Shutting down

Пример вывода, если входное значение равно 0:

(Нет вывода: dummy logger молча игнорирует все сообщения)

Элегантность этого решения заключается в том, что main.c использует logger одинаково независимо от того, какой тип он получает. Factory решает, что создать, а полиморфизм гарантирует выполнение appropriate поведения. Этот паттерн бесценен в реальных приложениях, где во время разработки может потребоваться подробное logging, а в рабочей среде — бесшумная работа.

Попробуйте сами

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

int main() {
    // Считать флаг типа логгера (1 для console, 0 для dummy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Использовать фабрику для создания соответствующего логгера
    
    // TODO: Call the logger's log function with "Starting application"
    
    // TODO: Call the logger's log function with "Shutting down"
    
    // TODO: Освободить логгер
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C