Récapitulatif : Logger Factory
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 57 sur 61.
Défi
FacileConstruisons une Logger Factory — un système qui démontre la puissance de la combinaison du pattern Factory avec le polymorphisme. Votre factory créera différentes implémentations de logger basées sur un drapeau de configuration, permettant au code de basculer entre une sortie console verbeuse et une journalisation "dummy" silencieuse sans changer la façon dont les loggers sont utilisés.
Vous organiserez votre code sur trois fichiers :
logger.h: Définissez une structureLoggerqui agit comme une interface — elle doit contenir un pointeur de fonction pourlogqui prend unLogger*et un messageconst char*. Déclarez votre fonction factorycreate_loggerqui prend un drapeau entier (1 pour la console, 0 pour le dummy) et retourne unLogger*. Déclarez également une fonctionfree_loggerpour le nettoyage.logger.c: Implémentez deux types de logger concrets. LeConsoleLoggerimbriqueLoggercomme premier membre et possède une fonction de log qui affiche les messages au format[LOG] message. LeDummyLoggerimbrique égalementLoggermais sa fonction de log ne fait rien — elle se contente de retourner sans rien afficher. Créez des fonctions constructeurs pour chaque type qui allouent de la mémoire et lient la fonction de log appropriée. Ensuite, implémentezcreate_loggercomme une factory qui vérifie le drapeau et retourne le type de logger approprié sous forme deLogger*. Implémentezfree_loggerpour libérer la mémoire.main.c: Lisez un entier (1 ou 0) pour déterminer quel logger créer. Utilisez votre factory pour créer le logger approprié, puis appelez sa fonctionlogavec deux messages :"Starting application"et"Shutting down". Enfin, libérez le logger.
Votre programme recevra une entrée : un entier indiquant le type de logger (1 pour la console, 0 pour le dummy).
Exemple de sortie lorsque l'entrée est 1 :
[LOG] Starting application
[LOG] Shutting downExemple de sortie lorsque l'entrée est 0 :
(Aucune sortie — le logger dummy ignore silencieusement tous les messages)
L'élégance ici est que main.c utilise le logger de manière identique quel que soit le type qu'il reçoit. La factory décide quoi créer, et le polymorphisme garantit l'exécution du comportement correct. Ce pattern est inestimable dans les applications réelles où vous pourriez vouloir une journalisation verbeuse pendant le développement mais un fonctionnement silencieux en production.
Essayez vous-même
#include <stdio.h>
#include "logger.h"
int main() {
// Lire le flag du type de logger (1 pour console, 0 pour dummy)
int flag;
scanf("%d", &flag);
// TODO: Utiliser la factory pour créer le logger approprié
// TODO: Appeler la fonction log du logger avec "Starting application"
// TODO: Appeler la fonction log du logger avec "Shutting down"
// TODO: Libérer le logger
return 0;
}
Toutes les leçons de Object Oriented Programming
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercle