Menu
Coddy logo textTech

Recapitulação: Logger Factory

Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 57 de 61.

challenge icon

Desafio

Fácil

Vamos construir uma Logger Factory — um sistema que demonstra o poder de combinar o padrão Factory com polimorfismo. Sua factory criará diferentes implementações de logger baseadas em uma flag de configuração, permitindo que o código alterne entre uma saída de console detalhada e um log "dummy" silencioso sem alterar como os loggers são usados.

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

  • logger.h: Defina uma struct Logger que atue como uma interface — ela deve conter um ponteiro de função para log que recebe um Logger* e uma mensagem const char*. Declare sua função factory create_logger que recebe um flag inteiro (1 para console, 0 para dummy) e retorna um Logger*. Também declare uma função free_logger para 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 alocam memória e conectam a função de log apropriada. Em seguida, implemente create_logger como uma factory que verifica a flag 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 factory 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 número 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 dummy logger ignora silenciosamente todas as mensagens)

A elegância aqui é que o main.c usa o logger de forma idêntica, independentemente de qual tipo ele receba. A factory decide o que criar, e o polimorfismo garante que o comportamento correto seja executado. Esse padrão é inestimável em aplicações reais, onde você pode desejar logs detalhados durante o desenvolvimento, mas 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: Chame a função log do logger com "Starting application"
    
    // TODO: Chame a função log do logger com "Shutting down"
    
    // TODO: Libere o logger
    
    return 0;
}

Todas as lições de Object Oriented Programming