Итоги: Logger Factory
Часть раздела Объектно-ориентированное программирование путешествия по C на Coddy. Урок 57 из 61.
Задание
ЛегкоДавайте создадим Logger Factory: систему, демонстрирующую возможности объединения паттерна Factory с полиморфизмом. Ваша factory будет создавать различные реализации logger на основе конфигурационного flag, позволяя коду переключаться между подробным выводом в консоль и тихим журналированием через "dummy" без изменения способа использования logger.
Вы организуете код в трёх файлах:
logger.h: Define структуруLogger, которая acts как интерфейс. Она должна содержать указатель на function дляlog, принимающуюLogger*и сообщениеconst char*. Объявите вашу factory functioncreate_logger, которая принимает integer flag (1 для консоли, 0 для dummy) и возвращаетLogger*. Также объявите functionfree_loggerдля очистки.logger.c: Implement два конкретных типа logger.ConsoleLoggerвстраиваетLoggerв качестве своего first члена и имеет function log, которая выводит сообщения в формате[LOG] message.DummyLoggerтакже встраиваетLogger, но его function log ничего не делает. Она просто возвращает управление, не выполняя вывод. Создайте constructor functions для каждого типа, которые выделяют память и подключают appropriate function log. Затем Implementcreate_loggerкак factory, которая проверяет flag и возвращает appropriate тип logger какLogger*. Implementfree_loggerдля освобождения памяти.main.c: Считайте integer (1 или 0), чтобы определить, какой logger создать. Используйте вашу factory, чтобы создать appropriate logger, затем вызовите его functionlogс двумя сообщениями:"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;
}
Все уроки раздела Объектно-ориентированное программирование
1Основы модульного программирования
Заголовочные файлыСтражи включенияИсходные файлыСтатические функцииПовторение: Модульный калькулятор4Инкапсуляция
Концепция непрозрачных указателейОпределение непрозрачных структурГеттеры и сеттерыВалидация в сеттерахИтоги: Секретный ящик2Объекты и методы
Структуры как объектыУказатель 'Self'Константная корректностьУказатель против значенияВспомогательные методыИтоги: Point Manager5Проект: Простой банковский счет
Настройка проектаРеализация счета3Жизненный цикл объекта
Паттерн «Конструктор»Паттерн «Деструктор»Инициализация в стекеГлубокое копированиеПовторение: String Wrapper6Наследование через композицию
Встраивание структурПравило первого элементаДоступ к элементам родителяUpcastingПовторение: Иерархия фигур9Проект: Рисование фигур
Обзор проектаРеализация кругаРеализация прямоугольникаПолиморфное использованиеКонтейнер фигурПотренируйтесь самостоятельно: Онлайн-компилятор C