Zusammenfassung: Logger Factory
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 57 von 61.
Aufgabe
EinfachLassen 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 einLogger-Struct, das als Interface fungiert — es sollte einen Funktionszeiger fürlogenthalten, der einenLogger*und eineconst char*Nachricht entgegennimmt. Deklarieren Sie Ihre Factory-Funktioncreate_logger, die ein Integer-Flag (1 für Konsole, 0 für Dummy) entgegennimmt und einenLogger*zurückgibt. Deklarieren Sie außerdem einefree_logger-Funktion zur Bereinigung.logger.c: Implementieren Sie zwei konkrete Logger-Typen. DerConsoleLoggerbettetLoggerals sein erstes Element 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. Erstellen Sie Konstruktor-Funktionen für jeden Typ, die Speicher reservieren und die entsprechende Log-Funktion verknüpfen. Implementieren Sie danncreate_loggerals eine Factory, die das Flag prüft und den entsprechenden Logger-Typ alsLogger*zurückgibt. Implementieren Siefree_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 dessenlog-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 downBeispielausgabe, 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
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-Implementierung