Menu
Coddy logo textTech

Zusammenfassung: Logger Factory

Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 57 von 61.

challenge icon

Aufgabe

Einfach

Erstellen wir eine Logger Factory: ein System, das die Leistungsfähigkeit der Kombination aus Factory-Pattern und Polymorphie demonstriert. Deine Factory erstellt verschiedene Logger-Implementierungen basierend auf einem Konfigurations-Flag und ermöglicht es dem Code, zwischen ausführlicher Konsolenausgabe und stillem „Dummy“-Logging zu wechseln, ohne die Verwendung der Logger zu ändern.

Du organisierst deinen Code über drei Dateien:

  • logger.h: Definiere eine Logger-Struktur, die als Schnittstelle fungiert. Sie sollte einen Funktionszeiger für log enthalten, der einen Logger* und eine const char*-Nachricht entgegennimmt. Deklariere deine Factory-Funktion create_logger, die ein ganzzahliges Flag (1 für Konsole, 0 für Dummy) entgegennimmt und einen Logger* zurückgibt. Deklariere außerdem eine free_logger-Funktion zur Speicherfreigabe.
  • logger.c: Implementiere zwei konkrete Logger-Typen. Der ConsoleLogger bettet Logger als erstes Mitglied 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. Erstelle Konstruktorfunktionen für jeden Typ, die Speicher reservieren und die passende Log-Funktion zuweisen. Implementiere anschließend create_logger als Factory, die das Flag überprüft und den passenden Logger-Typ als Logger* zurückgibt. Implementiere free_logger, um den Speicher freizugeben.
  • main.c: Lies eine Ganzzahl (1 oder 0) ein, um zu bestimmen, welcher Logger erstellt werden soll. Verwende deine Factory, um den passenden Logger zu erstellen, und rufe anschließend seine log-Funktion mit zwei Nachrichten auf: "Starting application" und "Shutting down". Gib schließlich den Logger frei.

Dein Programm erhält eine Eingabe: eine Ganzzahl, die den Logger-Typ angibt (1 für Konsole, 0 für Dummy).

Beispielausgabe bei der Eingabe 1:

[LOG] Starting application
[LOG] Shutting down

Beispielausgabe bei der Eingabe 0:

(Keine Ausgabe: Der Dummy-Logger ignoriert alle Nachrichten stillschweigend.)

Das Elegante daran ist, dass main.c den Logger unabhängig vom erhaltenen Typ identisch verwendet. Die Factory entscheidet, was erstellt wird, und die Polymorphie stellt sicher, dass das richtige Verhalten ausgeführt wird. Dieses Pattern ist in realen Anwendungen äußerst wertvoll, wenn du während der Entwicklung eine ausführliche Protokollierung, in der Produktion jedoch einen lautlosen Betrieb wünschst.

Probier es selbst

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

int main() {
    // Lese das Logger-Typ-Flag (1 für Konsole, 0 für Dummy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Verwende die Factory, um den entsprechenden Logger zu erstellen
    
    // TODO: Call the logger's log function with "Starting application"
    
    // TODO: Call the logger's log function with "Shutting down"
    
    // TODO: Gib den Logger frei
    
    return 0;
}

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-C-Compiler