Menu
CoddyTech

Revisão: Factory de Logger

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 registradores: um sistema que demonstra o poder de combinar o padrão Factory com polimorfismo. Sua fábrica criará diferentes implementações de registrador com base em um sinalizador de configuração, permitindo alternar entre a saída detalhada no console e o registro silencioso de “dummy” sem mudar a forma como os registradores são usados.

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

  • logger.h: Defina uma struct Logger que funciona como uma interface. Ela deve conter um ponteiro para função log que recebe 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 liberar a memória.
  • logger.c: Implemente dois tipos concretos de registrador. ConsoleLogger incorpora Logger como seu primeiro membro e tem uma função de registro que imprime mensagens no formato [LOG] message. DummyLogger também incorpora Logger, mas sua função de registro não faz nada. Ela simplesmente retorna sem imprimir. Crie funções construtoras para cada tipo que aloquem memória e configurem o ponteiro para a função de registro apropriada. Em seguida, implemente create_logger como uma fábrica que verifica o sinalizador e retorna o tipo de registrador apropriado como um Logger*. Implemente free_logger para liberar a memória.
  • main.c: Leia um inteiro (1 ou 0) para determinar qual registrador criar. Use sua fábrica para criar o registrador apropriado e, em seguida, chame sua função log com duas mensagens: "Starting application" e "Shutting down". Por fim, libere o registrador.

Seu programa receberá uma entrada: um inteiro que indica o tipo de registrador (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 registrador dummy ignora silenciosamente todas as mensagens)

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

Experimente você mesmo

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

int main() {
    // Leia o indicador 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 Programação Orientada a Objetos

Pratique por conta própria: Compilador de C online