Recapitulação: Logger Factory
Parte da seção Object Oriented Programming do Journey de C da Coddy — lição 57 de 61.
Desafio
FácilVamos 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 structLoggerque atue como uma interface — ela deve conter um ponteiro de função paralogque recebe umLogger*e uma mensagemconst char*. Declare sua função factorycreate_loggerque recebe um flag inteiro (1 para console, 0 para dummy) e retorna umLogger*. Também declare uma funçãofree_loggerpara limpeza.logger.c: Implemente dois tipos concretos de logger. OConsoleLoggerincorporaLoggercomo seu primeiro membro e possui uma função de log que imprime mensagens no formato[LOG] message. ODummyLoggertambém incorporaLogger, 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, implementecreate_loggercomo uma factory que verifica a flag e retorna o tipo de logger apropriado como umLogger*. Implementefree_loggerpara 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çãologcom 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 downExemplo 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
1Fundamentos da Programação Modular
Arquivos de CabeçalhoInclude GuardsArquivos-FonteFunções EstáticasRecapitulação: Calculadora Modular4Encapsulamento
Conceito de Ponteiros OpacosDefinindo Structs OpacasGetters e SettersValidação em SettersRecapitulação: Caixa Secreta2Objetos e Métodos
Structs como ObjetosO Ponteiro 'Self'Const CorrectnessPonteiro vs ValorMétodos AuxiliaresRecapitulação: Point Manager5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de Vida de Objetos
Padrão de ConstrutorPadrão de DestrutorInicialização na StackCópia ProfundaRecapitulação: String Wrapper6Herança via Composição
Incorporação de StructsA Regra do Primeiro MembroAcessando Membros PaiUpcastingRecapitulação: Hierarquia de Formas9Projeto: Desenhador de Formas
Visão Geral do ProjetoImplementação do Círculo