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.
Desafio
FácilVamos 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 structLoggerque funciona como uma interface. Ela deve conter um ponteiro para funçãologque recebe umLogger*e uma mensagemconst char*. Declare sua função de fábricacreate_logger, que recebe um sinalizador inteiro (1 para console, 0 para dummy) e retorna umLogger*. Declare também uma funçãofree_loggerpara liberar a memória.logger.c: Implemente dois tipos concretos de registrador.ConsoleLoggerincorporaLoggercomo seu primeiro membro e tem uma função de registro que imprime mensagens no formato[LOG] message.DummyLoggertambém incorporaLogger, 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, implementecreate_loggercomo uma fábrica que verifica o sinalizador e retorna o tipo de registrador apropriado como umLogger*. Implementefree_loggerpara 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çãologcom 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 downExemplo 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
1Fundamentos da Programação Modular
Arquivos de cabeçalhoProteções de inclusãoArquivos-fonteFunções estáticasRevisão: calculadora modular4Encapsulamento
Conceito de ponteiros opacosDefinindo structs opacasGetters e settersValidação em settersRevisão: caixa secreta2Objetos e métodos
Structs como objetosO ponteiro 'Self'Correção de constPonteiro vs. valorMétodos auxiliaresRevisão: Gerenciador de pontos5Projeto: Conta Bancária Simples
Configuração do ProjetoImplementação da Conta3Ciclo de vida do objeto
Padrão de construtorPadrão de destrutorInicialização da pilhaCópia profundaRevisão: wrapper de String6Herança por composição
Incorporação de structRegra do primeiro membroAcessando membros do tipo paiUpcastingRevisão: hierarquia de formas9Projeto: Desenhador de Formas
Visão geral do projetoImplementação do círculoImplementação do retânguloUso polimórficoContêiner de formasPratique por conta própria: Compilador de C online