Menu
Coddy logo textTech

Zusammenfassung: Logger Factory

Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 57 von 61.

challenge icon

Aufgabe

Einfach

Lassen Sie uns eine Logger Factory bauen — ein System, das die Leistungsfähigkeit der Kombination des Factory-Musters mit Polymorphie demonstriert. Ihre Factory wird basierend auf einem Konfigurations-Flag verschiedene Logger-Implementierungen erstellen, was es dem Code ermöglicht, zwischen ausführlicher Konsolenausgabe und stillem "Dummy"-Logging zu wechseln, ohne die Art und Weise zu ändern, wie Logger verwendet werden.

Sie werden Ihren Code in drei Dateien organisieren:

  • logger.h: Definieren Sie ein Logger-Struct, das als Interface fungiert — es sollte einen Funktionszeiger für log enthalten, der einen Logger* und eine const char* Nachricht entgegennimmt. Deklarieren Sie Ihre Factory-Funktion create_logger, die ein Integer-Flag (1 für Konsole, 0 für Dummy) entgegennimmt und einen Logger* zurückgibt. Deklarieren Sie außerdem eine free_logger-Funktion zur Bereinigung.
  • logger.c: Implementieren Sie zwei konkrete Logger-Typen. Der ConsoleLogger bettet Logger als sein erstes Element ein und verfügt über eine Log-Funktion, die Nachrichten im Format [LOG] message ausgibt. Der DummyLogger bettet ebenfalls Logger ein, aber seine Log-Funktion tut nichts — sie kehrt einfach zurück, ohne etwas auszugeben. Erstellen Sie Konstruktor-Funktionen für jeden Typ, die Speicher reservieren und die entsprechende Log-Funktion verknüpfen. Implementieren Sie dann create_logger als eine Factory, die das Flag prüft und den entsprechenden Logger-Typ als Logger* zurückgibt. Implementieren Sie free_logger, um den Speicher freizugeben.
  • main.c: Lesen Sie einen Integer (1 oder 0) ein, um zu bestimmen, welcher Logger erstellt werden soll. Verwenden Sie Ihre Factory, um den entsprechenden Logger zu erstellen, und rufen Sie dann dessen log-Funktion mit zwei Nachrichten auf: "Starting application" und "Shutting down". Geben Sie schließlich den Logger frei.

Ihr Programm erhält eine Eingabe: einen Integer, der den Logger-Typ angibt (1 für Konsole, 0 für Dummy).

Beispielausgabe, wenn die Eingabe 1 ist:

[LOG] Starting application
[LOG] Shutting down

Beispielausgabe, wenn die Eingabe 0 ist:

(Keine Ausgabe — der Dummy-Logger ignoriert alle Nachrichten stillschweigend)

Die Eleganz hierbei ist, dass main.c den Logger identisch verwendet, unabhängig davon, welchen Typ er erhält. Die Factory entscheidet, was erstellt wird, und Polymorphie stellt sicher, dass das korrekte Verhalten ausgeführt wird. Dieses Muster ist in realen Anwendungen von unschätzbarem Wert, wenn Sie beispielsweise während der Entwicklung ein ausführliches Logging wünschen, in der Produktion jedoch einen lautlosen Betrieb.

Probier es selbst

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

int main() {
    // Den Logger-Typ-Flag lesen (1 für Konsole, 0 für Dummy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Die Factory verwenden, um den entsprechenden Logger zu erstellen
    
    // TODO: Die Log-Funktion des Loggers mit "Starting application" aufrufen
    
    // TODO: Die Log-Funktion des Loggers mit "Shutting down" aufrufen
    
    // TODO: Den Logger freigeben
    
    return 0;
}

Alle Lektionen in Object Oriented Programming