Riepilogo: Factory di Logger
Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 57 di 61.
Sfida
FacileCostruiamo una Factory di logger: un sistema che dimostra la potenza della combinazione del pattern Factory con il polimorfismo. La tua factory creerà diverse implementazioni di logger in base a un flag di configurazione, permettendo al codice di passare dall'output dettagliato della console al logging silenzioso del "dummy" senza cambiare il modo in cui vengono usati i logger.
Organizzerai il codice in tre file:
logger.h: Definisci una strutturaLoggerche funge da interfaccia. Dovrebbe contenere un puntatore a funzione perlogche accetta unLogger*e un messaggioconst char*. Dichiara la tua funzione factorycreate_logger, che accetta un flag intero (1 per la console, 0 per dummy) e restituisce unLogger*. Dichiara anche una funzionefree_loggerper la pulizia.logger.c: Implementa due tipi concreti di logger.ConsoleLoggerincorporaLoggercome primo membro e ha una funzione di logging che stampa i messaggi nel formato[LOG] message. AncheDummyLoggerincorporaLogger, ma la sua funzione di logging non fa nulla. Si limita a restituire senza stampare. Crea funzioni costruttore per ciascun tipo, che allocano memoria e collegano la funzione di logging appropriata. Poi implementacreate_loggercome factory che controlla il flag e restituisce il tipo di logger appropriato comeLogger*. Implementafree_loggerper liberare la memoria.main.c: Leggi un intero (1 o 0) per determinare quale logger creare. Usa la tua factory per creare il logger appropriato, poi chiama la sua funzionelogcon due messaggi:"Starting application"e"Shutting down". Infine, libera il logger.
Il programma riceverà un input: un intero che indica il tipo di logger (1 per la console, 0 per dummy).
Esempio di output quando l'input è 1:
[LOG] Starting application
[LOG] Shutting downEsempio di output quando l'input è 0:
(Nessun output: il logger dummy ignora silenziosamente tutti i messaggi)
La cosa elegante è che main.c usa il logger allo stesso modo, indipendentemente dal tipo ricevuto. La factory decide cosa creare e il polimorfismo garantisce che venga eseguito il comportamento corretto. Questo pattern è preziosissimo nelle applicazioni reali, in cui potresti volere un logging dettagliato durante lo sviluppo, ma un funzionamento silenzioso in produzione.
Provalo tu
#include <stdio.h>
#include "logger.h"
int main() {
// Leggi il flag del tipo di logger (1 per console, 0 per dummy)
int flag;
scanf("%d", &flag);
// TODO: Usa la factory per creare il logger appropriato
// TODO: Chiama la funzione log del logger con "Starting application"
// TODO: Chiama la funzione log del logger con "Shutting down"
// TODO: Libera il logger
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Basi di programmazione modulare
File di intestazioneGuardie di inclusioneFile sorgenteFunzioni staticheRipasso: calcolatrice modulare4Incapsulamento
Il concetto di puntatori opachiDefinire struct opacheGetter e setterLa convalida nei setterRiepilogo: scatola segreta2Oggetti e metodi
Le struct come oggettiIl puntatore 'Self'Correttezza constPuntatore o valoreMetodi di supportoRiepilogo: gestore di punti5Progetto: Conto bancario semplice
Configurazione del progettoImplementazione del conto8Polimorfismo
Puntatori a funzione nelle structSimulare i metodiIl concetto di interfacciaImplementare le interfacceIterazione polimorficaRiepilogo: Greeter11Pattern di progettazione in C
Pattern SingletonPattern FactoryPattern IteratorRiepilogo: Factory di Logger3Ciclo di vita degli oggetti
Pattern del costruttorePattern del distruttoreInizializzazione sullo stackCopia profondaRiepilogo: wrapper di stringhe6Ereditarietà tramite composizione
Incorporamento delle structLa regola del primo membroAccesso ai membri della classe baseUpcastingRiepilogo: gerarchia di forme9Progetto: Disegnatore di forme
Panoramica del progettoImplementazione del cerchioImplementazione del rettangoloUtilizzo polimorficoContenitore di formeEsercitati da solo: Compilatore C online