Menu
Coddy logo textTech

Resumen: Logger Factory

Parte de la sección Object Oriented Programming del Journey de C de Coddy — lección 57 de 61.

challenge icon

Desafío

Fácil

Vamos 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 estructura Logger que actúe como una interfaz; debe contener un puntero de función para log que reciba un Logger* y un mensaje const char*. Declara tu función de fábrica create_logger que recibe un flag entero (1 para consola, 0 para dummy) y devuelve un Logger*. También declara una función free_logger para la limpieza.
  • logger.c: Implementa dos tipos de registradores concretos. El ConsoleLogger incrusta Logger como su primer miembro y tiene una función de registro que imprime mensajes en el formato [LOG] message. El DummyLogger también incrusta Logger pero 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, implementa create_logger como una fábrica que verifique el flag y devuelva el tipo de registrador apropiado como un Logger*. Implementa free_logger para 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ón log con 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 down

Ejemplo 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