Podsumowanie: fabryka loggera
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 57 z 61.
Wyzwanie
ŁatwyZbudujmy 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 przyjmujeLogger*oraz komunikat typuconst char*. Zadeklaruj funkcję fabrykującącreate_logger, która przyjmuje flagę całkowitą (1 dla konsoli, 0 dla loggera pozornego) i zwracaLogger*. Zadeklaruj też funkcjęfree_loggerdo zwalniania zasobów.logger.c: Zaimplementuj dwa konkretne typy loggera.ConsoleLoggerosadzaLoggerjako swój pierwszy element i ma funkcję logującą, która wypisuje komunikaty w formacie[LOG] message.DummyLoggerrównież osadzaLogger, 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 zaimplementujcreate_loggerjako fabrykę, która sprawdza flagę i zwraca odpowiedni typ loggera jakoLogger*. Zaimplementujfree_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ęlogz 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 downPrzykł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
1Podstawy programowania modularnego
Pliki nagłówkoweZabezpieczenia przed wielokrotnym dołączeniemPliki źródłoweFunkcje statycznePodsumowanie: kalkulator modularny4Enkapsulacja
Koncepcja niejawnych wskaźnikówDefiniowanie niejawnych strukturGettery i setteryWalidacja w setterachPowtórka: tajemnicze pudełko2Obiekty i metody
Struktury jako obiektyWskaźnik „self”Poprawność constWskaźnik czy wartośćMetody pomocniczePodsumowanie: menedżer punktów5Projekt: Proste konto bankowe
Konfiguracja projektuImplementacja konta8Polimorfizm
Wskaźniki do funkcji w strukturachSymulowanie metodKoncepcja interfejsuImplementowanie interfejsówIteracja polimorficznaPodsumowanie: Greeter11Wzorce projektowe w C
Wzorzec SingletonWzorzec fabrykiWzorzec iteratoraPodsumowanie: fabryka loggera3Cykl życia obiektu
Wzorzec konstruktoraWzorzec destruktoraInicjalizacja na stosieKopia głębokaPodsumowanie: klasa opakowująca ciąg znaków6Dziedziczenie przez kompozycję
Osadzanie strukturZasada pierwszego elementuDostęp do elementów klasy nadrzędnejKonwersja w górę hierarchiiPodsumowanie: hierarchia kształtów9Projekt: Rysownik kształtów
Przegląd projektuImplementacja kołaImplementacja prostokątaZastosowanie polimorfizmuKontener kształtówPoćwicz samodzielnie: Kompilator C online