Menu
Coddy logo textTech

Recapitulação: Logger Factory

Parte da seção Programação Orientada a Objetos do Journey de C da Coddy. Lição 57 de 61.

challenge icon

Desafio

Fácil

Vamos criar uma Fábrica de Loggers: um sistema que demonstra o poder de combinar o padrão Factory com polimorfismo. Sua fábrica criará diferentes implementações de logger com base em um sinalizador de configuração, permitindo que o código alterne entre uma saída detalhada no console e um logging "dummy" silencioso sem alterar a forma como os loggers são usados.

Você organizará seu código em três arquivos:

  • logger.h: defina uma struct Logger que atua como uma interface. Ela deve conter um ponteiro de função para log que receba um Logger* e uma mensagem const char*. Declare sua função de fábrica create_logger, que recebe um sinalizador inteiro (1 para console, 0 para dummy) e retorna um Logger*. Declare também uma função free_logger para a limpeza.
  • logger.c: implemente dois tipos concretos de logger. O ConsoleLogger incorpora Logger como seu primeiro membro e possui uma função de log que imprime mensagens no formato [LOG] message. O DummyLogger também incorpora Logger, mas sua função de log não faz nada. Ela simplesmente retorna sem imprimir. Crie funções construtoras para cada tipo que aloquem memória e conectem a função de log apropriada. Em seguida, implemente create_logger como uma fábrica que verifica o sinalizador e retorna o tipo de logger apropriado como um Logger*. Implemente free_logger para liberar a memória.
  • main.c: leia um inteiro (1 ou 0) para determinar qual logger criar. Use sua fábrica para criar o logger apropriado e, em seguida, chame sua função log com duas mensagens: "Starting application" e "Shutting down". Por fim, libere o logger.

Seu programa receberá uma entrada: um inteiro indicando o tipo de logger (1 para console, 0 para dummy).

Exemplo de saída quando a entrada é 1:

[LOG] Starting application
[LOG] Shutting down

Exemplo de saída quando a entrada é 0:

(Nenhuma saída: o logger dummy ignora silenciosamente todas as mensagens.)

A elegância está no fato de que main.c usa o logger de forma idêntica, independentemente do tipo recebido. A fábrica decide o que criar, e o polimorfismo garante que o comportamento correto seja executado. Esse padrão é inestimável em aplicações reais nas quais você pode querer um logging detalhado durante o desenvolvimento, mas uma operação silenciosa em produção.

Experimente você mesmo

#include <stdio.h>
#include "logger.h"

int main() {
    // Lê a flag do tipo de logger (1 para console, 0 para dummy)
    int flag;
    scanf("%d", &flag);
    
    // TODO: Use a factory para criar o logger apropriado
    
    // TODO: Call the logger's log function with "Starting application"
    
    // TODO: Call the logger's log function with "Shutting down"
    
    // TODO: Libere o logger
    
    return 0;
}

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online