Итоги: Logger Factory
Часть раздела Object Oriented Programming путешествия по C на Coddy — урок 57 из 61.
Задание
ЛегкоДавайте создадим Logger Factory — систему, демонстрирующую мощь сочетания паттерна «Фабрика» с полиморфизмом. Ваша фабрика будет создавать различные реализации логгера на основе флага конфигурации, позволяя коду переключаться между подробным выводом в консоль и бесшумным «пустым» логированием без изменения способа использования логгеров.
Вы организуете свой код в трех файлах:
logger.h: Определите структуруLogger, которая действует как интерфейс — она должна содержать указатель на функциюlog, принимающуюLogger*и сообщениеconst char*. Объявите вашу фабричную функциюcreate_logger, которая принимает целочисленный флаг (1 для консоли, 0 для пустышки) и возвращает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 для пустышки).
Пример вывода, когда входное значение равно 1:
[LOG] Starting application
[LOG] Shutting downПример вывода, когда входное значение равно 0:
(Нет вывода — пустой логгер молча игнорирует все сообщения)
Элегантность здесь заключается в том, что main.c использует логгер одинаково, независимо от того, какой тип он получает. Фабрика решает, что создавать, а полиморфизм обеспечивает выполнение правильного поведения. Этот паттерн неоценим в реальных приложениях, где вам может понадобиться подробное логирование во время разработки, но бесшумная работа в продакшене.
Попробуйте сами
#include <stdio.h>
#include "logger.h"
int main() {
// Считать флаг типа логгера (1 для консоли, 0 для заглушки)
int flag;
scanf("%d", &flag);
// TODO: Используйте фабрику для создания соответствующего логгера
// TODO: Вызовите функцию log логгера с аргументом "Starting application"
// TODO: Вызовите функцию log логгера с аргументом "Shutting down"
// TODO: Освободите логгер
return 0;
}
Все уроки раздела Object Oriented Programming
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация круга