Resumen: Logger Factory
Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 57 de 61.
Desafío
FácilVamos a construir una Logger Factory (Fábrica de Registradores), un sistema que demuestra el poder de combinar el patrón Factory con el polimorfismo. Tu fábrica creará diferentes implementaciones de registradores basadas en una bandera de configuración, permitiendo que el código cambie entre una salida de consola detallada y un registro "dummy" silencioso sin cambiar la forma en que se utilizan los registradores.
Organizarás tu código en tres archivos:
logger.h: Define una estructuraLoggerque actúe como una interfaz; debe contener un puntero de función paralogque reciba unLogger*y un mensajeconst char*. Declara tu función de fábricacreate_loggerque recibe un flag entero (1 para consola, 0 para dummy) y devuelve unLogger*. También declara una funciónfree_loggerpara la limpieza.logger.c: Implementa dos tipos de registradores concretos. ElConsoleLoggerincrustaLoggercomo su primer miembro y tiene una función de registro que imprime mensajes en el formato[LOG] message. ElDummyLoggertambién incrustaLoggerpero su función de registro no hace nada: simplemente retorna sin imprimir. Crea funciones constructoras para cada tipo que asignen memoria y vinculen la función de registro adecuada. Luego, implementacreate_loggercomo una fábrica que verifique el flag y devuelva el tipo de registrador apropiado como unLogger*. Implementafree_loggerpara liberar la memoria.main.c: Lee un entero (1 o 0) para determinar qué registrador crear. Usa tu fábrica para crear el registrador apropiado, luego llama a su funciónlogcon dos mensajes:"Starting application"y"Shutting down". Finalmente, libera el registrador.
Tu programa recibirá una entrada: un número entero que indica el tipo de registrador (1 para consola, 0 para dummy).
Ejemplo de salida cuando la entrada es 1:
[LOG] Starting application
[LOG] Shutting downEjemplo de salida cuando la entrada es 0:
(Sin salida: el registrador dummy ignora silenciosamente todos los mensajes)
La elegancia aquí es que main.c utiliza el registrador de manera idéntica independientemente del tipo que reciba. La fábrica decide qué crear y el polimorfismo asegura que se ejecute el comportamiento correcto. Este patrón es invaluable en aplicaciones reales donde podrías desear un registro detallado durante el desarrollo pero una operación silenciosa en producción.
Pruébalo tú mismo
#include <stdio.h>
#include "logger.h"
int main() {
// Lee el flag del tipo de logger (1 para consola, 0 para dummy)
int flag;
scanf("%d", &flag);
// TODO: Usa la factory para crear el logger apropiado
// TODO: Llama a la función log del logger con "Starting application"
// TODO: Llama a la función log del logger con "Shutting down"
// TODO: Libera el logger
return 0;
}
Todas las lecciones de Object Oriented Programming
1Fundamentos de programación modular
Archivos de cabeceraGuardas de inclusiónArchivos fuenteFunciones estáticasRepaso: Calculadora modular4Encapsulamiento
Concepto de punteros opacosDefinición de structs opacosGetters y SettersValidación en settersResumen: Caja secreta7Punteros a funciones
Declaración de punteros a funcionesLlamada a punteros a funcionesTypedef para punteros a funcionesPasar funciones como argumentosRepaso: Dispatch de calculadora10Contenedores genéricos
Repaso de punteros voidWrapper genéricoSwap genéricoComparación genéricaRepaso: Array genérico2Objetos y métodos
Structs como objetosEl puntero 'Self'Const CorrectnessPuntero vs. ValorMétodos auxiliaresResumen: Point Manager5Proyecto: Cuenta bancaria simple
Configuración del proyectoImplementación de la cuenta3Ciclo de vida de los objetos
Patrón ConstructorPatrón DestructorInicialización en StackCopia profundaResumen: String Wrapper6Herencia mediante composición
Incrustación de StructsLa regla del primer miembroAcceso a miembros padreUpcastingResumen: Jerarquía de formas9Proyecto: Dibujador de figuras
Descripción general del proyectoImplementación del círculo