Menu
Coddy logo textTech

Podsumowanie: fabryka loggera

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 57 z 61.

challenge icon

Wyzwanie

Łatwy

Zbudujmy fabrykę loggerów: system, który pokazuje możliwości połączenia wzorca Fabryka z polimorfizmem. Fabryka będzie tworzyć różne implementacje loggera na podstawie flagi konfiguracji, umożliwiając przełączanie się między szczegółowymi komunikatami w konsoli a cichym logowaniem typu "dummy" bez zmiany sposobu korzystania z loggerów.

Rozmieścisz kod w trzech plikach:

  • logger.h: Zdefiniuj strukturę Logger, która pełni rolę interfejsu. Powinna zawierać wskaźnik na funkcję log, która przyjmuje Logger* oraz komunikat typu const char*. Zadeklaruj funkcję fabrykującą create_logger, która przyjmuje flagę całkowitą (1 dla konsoli, 0 dla loggera pozornego) i zwraca Logger*. Zadeklaruj też funkcję free_logger do zwalniania zasobów.
  • logger.c: Zaimplementuj dwa konkretne typy loggera. ConsoleLogger osadza Logger jako swój pierwszy element i ma funkcję logującą, która wypisuje komunikaty w formacie [LOG] message. DummyLogger również osadza Logger, ale jego funkcja logująca nic nie robi. Po prostu kończy działanie bez wypisywania czegokolwiek. Utwórz funkcje konstruktora dla każdego typu, które przydzielają pamięć i przypisują odpowiednią funkcję logującą. Następnie zaimplementuj create_logger jako fabrykę, która sprawdza flagę i zwraca odpowiedni typ loggera jako Logger*. Zaimplementuj free_logger, aby zwalniała pamięć.
  • main.c: Odczytaj liczbę całkowitą (1 lub 0), aby określić, który logger utworzyć. Użyj fabryki, aby utworzyć odpowiedni logger, a następnie wywołaj jego funkcję log z dwoma komunikatami: "Starting application" i "Shutting down". Na koniec zwolnij logger.

Program otrzyma jedno wejście: liczbę całkowitą wskazującą typ loggera (1 dla konsoli, 0 dla loggera pozornego).

Przykładowe wyjście, gdy wejściem jest 1:

[LOG] Starting application
[LOG] Shutting down

Przykładowe wyjście, gdy wejściem jest 0:

(Brak wyjścia: logger pozorny po cichu ignoruje wszystkie komunikaty)

Elegancja tego rozwiązania polega na tym, że main.c korzysta z loggera w identyczny sposób, niezależnie od otrzymanego typu. Fabryka decyduje, co utworzyć, a polimorfizm zapewnia wykonanie właściwego działania. Ten wzorzec jest nieoceniony w rzeczywistych aplikacjach, w których podczas programowania możesz chcieć szczegółowego logowania, a w środowisku produkcyjnym — cichego działania.

Spróbuj swoich sił

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

int main() {
    // Odczytaj flagę typu loggera (1 dla konsoli, 0 dla atrapy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Użyj fabryki, aby utworzyć odpowiedni logger
    
    // TODO: Wywołaj funkcję log loggera z argumentem "Starting application"
    
    // TODO: Wywołaj funkcję log loggera z argumentem "Shutting down"
    
    // TODO: Zwolnij pamięć loggera
    
    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online