Zusammenfassung: Logger Factory
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 57 von 61.
Aufgabe
EinfachErstellen 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 eineLogger-Struktur, die als Schnittstelle fungiert. Sie sollte einen Funktionszeiger fürlogenthalten, der einenLogger*und eineconst char*-Nachricht entgegennimmt. Deklariere deine Factory-Funktioncreate_logger, die ein ganzzahliges Flag (1 für Konsole, 0 für Dummy) entgegennimmt und einenLogger*zurückgibt. Deklariere außerdem einefree_logger-Funktion zur Speicherfreigabe.logger.c: Implementiere zwei konkrete Logger-Typen. DerConsoleLoggerbettetLoggerals erstes Mitglied ein und verfügt über eine Log-Funktion, die Nachrichten im Format[LOG] messageausgibt. DerDummyLoggerbettet ebenfallsLoggerein, 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ßendcreate_loggerals Factory, die das Flag überprüft und den passenden Logger-Typ alsLogger*zurückgibt. Implementierefree_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 seinelog-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 downBeispielausgabe 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
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler