Récapitulatif : Logger Factory
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 57 sur 61.
Défi
FacileConstruisons une fabrique de journalisation : un système qui démontre la puissance de la combinaison du patron Factory avec le polymorphisme. Votre fabrique créera différentes implémentations de journalisation en fonction d’un indicateur de configuration, permettant au code de basculer entre une sortie console détaillée et une journalisation silencieuse avec un « dummy », sans modifier la manière dont les journaliseurs sont utilisés.
Vous organiserez votre code dans trois fichiers :
logger.h: définissez une structureLoggerqui sert d’interface. Elle doit contenir un pointeur de fonction pourlogqui prend unLogger*et un messageconst char*. Déclarez votre fonction de fabriquecreate_logger, qui prend un indicateur entier (1 pour la console, 0 pour le dummy) et renvoie unLogger*. Déclarez également une fonctionfree_loggerpour le nettoyage.logger.c: implémentez deux types concrets de journaliseurs. LeConsoleLoggerintègreLoggercomme premier membre et possède une fonction de journalisation qui affiche les messages au format[LOG] message. LeDummyLoggerintègre égalementLogger, mais sa fonction de journalisation ne fait rien. Elle retourne simplement sans rien afficher. Créez des fonctions constructrices pour chaque type, qui allouent de la mémoire et configurent le pointeur vers la fonction de journalisation appropriée. Implémentez ensuitecreate_loggercomme une fabrique qui vérifie l’indicateur et renvoie le type de journaliseur approprié sous forme deLogger*. Implémentezfree_loggerpour libérer la mémoire.main.c: lisez un entier (1 ou 0) pour déterminer quel journaliseur créer. Utilisez votre fabrique pour créer le journaliseur approprié, puis appelez sa fonctionlogavec deux messages :"Starting application"et"Shutting down". Enfin, libérez le journaliseur.
Votre programme recevra une entrée : un entier indiquant le type de journaliseur (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 journaliseur dummy ignore silencieusement tous les messages.)
L’élégance de cette approche réside dans le fait que main.c utilise le journaliseur de manière identique, quel que soit le type qu’il reçoit. La fabrique décide de ce qui doit être créé, et le polymorphisme garantit que le comportement correct est exécuté. Ce patron est extrêmement utile dans les applications réelles, lorsque vous souhaitez une journalisation détaillée 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 de 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: Call the logger's log function with "Starting application"
// TODO: Call the logger's log function with "Shutting down"
// TODO: Libérer le logger
return 0;
}
Toutes les leçons de Programmation Orientée Objet
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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne