Resumen: Logger Factory
Parte de la sección Programación Orientada a Objetos del Journey de C de Coddy. Lección 57 de 61.
Desafío
FácilConstruyamos una fábrica de registros: un sistema que demuestra el poder de combinar el patrón Factory con el polimorfismo. Tu fábrica creará diferentes implementaciones de registro basándose en un indicador de configuración, lo que permitirá que el código cambie entre una salida detallada en la consola y un registro silencioso de tipo "dummy" sin cambiar la forma en que se utilizan los registradores.
Organizarás tu código en tres archivos:
logger.h: Define una estructuraLoggerque actúa como una interfaz. Debe contener un puntero a función paralogque reciba unLogger*y un mensajeconst char*. Declara tu función de fábricacreate_logger, que recibe un indicador entero (1 para consola, 0 para dummy) y devuelve unLogger*. Declara también una funciónfree_loggerpara la limpieza.logger.c: Implementa dos tipos concretos de registradores.ConsoleLoggerincorporaLoggercomo su primer miembro y tiene una función de registro que imprime los mensajes con el formato[LOG] message.DummyLoggertambién incorporaLogger, pero su función de registro no hace nada. Simplemente retorna sin imprimir. Crea funciones constructoras para cada tipo que asignen memoria y conecten la función de registro correspondiente. Después, implementacreate_loggercomo una fábrica que compruebe el indicador 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 y, después, llama a su funciónlogcon dos mensajes:"Starting application"y"Shutting down". Finalmente, libera el registrador.
Tu programa recibirá una entrada: un entero que indica el tipo de registrador (1 para consola, 0 para dummy).
Salida de ejemplo cuando la entrada es 1:
[LOG] Starting application
[LOG] Shutting downSalida de ejemplo cuando la entrada es 0:
(Sin salida: el registrador dummy ignora silenciosamente todos los mensajes)
La elegancia de este enfoque está en que main.c utiliza el registrador de forma idéntica, independientemente del tipo que reciba. La fábrica decide qué crear, y el polimorfismo garantiza que se ejecute el comportamiento correcto. Este patrón es invaluable en aplicaciones reales en las que quizá quieras 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 console, 0 para dummy)
int flag;
scanf("%d", &flag);
// TODO: Usa la factory para crear el logger apropiado
// TODO: Call the logger's log function with "Starting application"
// TODO: Call the logger's log function with "Shutting down"
// TODO: Libera el logger
return 0;
}
Todas las lecciones de Programación Orientada a Objetos
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írculoImplementación del rectánguloUso polimórficoContenedor de figurasPractica por tu cuenta: Compilador de C online