Pular para conteúdo

Projeto 10: Padrões Criacionais: Factory Method e Abstract Factory 🏭

Escopo do Projeto

Objetivo: Implementar os padrões criacionais Factory Method e Abstract Factory para desacoplar a instanciação de famílias de objetos de suas implementações concretas.


🎯 1. Contexto & Desafio Prático

Sistemas corporativos devem ser capazes de suportar múltiplos ambientes e provedores de infraestrutura (ex: AWS, Azure, GCP ou gateways de pagamento Stripe vs Mercado Pago). Você construirá uma fábrica abstrata de gateways financeiros que instancia os emissores de cobrança e cancelamento sem acoplar a aplicação ao provedor específico.


📋 2. Requisitos Técnicos Obrigatórios

  • R1 (Factory Method): Implementar método fábrica em classe criadora abstrata para instanciação dinâmica de objetos de pagamento.
  • R2 (Abstract Factory): Construir fábricas concretas (StripeFactory, MercadoPagoFactory) que produzem famílias de produtos consistentes (Cobranca, Estorno).
  • R3 (Inversão do Acoplamento): O código cliente deve interagir exclusivamente com as interfaces abstratas da fábrica e dos produtos.
  • R4 (Troca Dinâmica em Runtime): Demonstrar a troca do provedor de pagamento através de variável de ambiente sem alterar o código cliente.

📐 3. Diagrama Conceitual & Arquitetura

classDiagram
    class PaymentFactory {
        <<interface>>
        +createChargeService() ChargeService
        +createRefundService() RefundService
    }
    class StripeFactory {
        +createChargeService() ChargeService
        +createRefundService() RefundService
    }
    class MercadoPagoFactory {
        +createChargeService() ChargeService
        +createRefundService() RefundService
    }
    PaymentFactory <|.. StripeFactory
    PaymentFactory <|.. MercadoPagoFactory

💻 4. Especificação Técnica & Código de Referência

// abstract_factory_payments.py
from abc import ABC, abstractmethod

class ChargeService(ABC):
    @abstractmethod
    def charge(self, amount: float) -> str: pass

class StripeCharge(ChargeService):
    def charge(self, amount: float) -> str:
        return f"Cobrado ${amount} via Stripe API"

class MercadoPagoCharge(ChargeService):
    def charge(self, amount: float) -> str:
        return f"Cobrado R${amount} via Mercado Pago Pix/Cartao"

class PaymentFactory(ABC):
    @abstractmethod
    def get_charge_service(self) -> ChargeService: pass

class StripeFactory(PaymentFactory):
    def get_charge_service(self) -> ChargeService:
        return StripeCharge()

class MercadoPagoFactory(PaymentFactory):
    def get_charge_service(self) -> ChargeService:
        return MercadoPagoCharge()

📦 5. Critérios de Avaliação e Entrega

  1. Implementação completa das interfaces e classes concretas da fábrica abstrata.
  2. Demonstração do código cliente consumindo as fábricas de forma transparente.
  3. Testes unitários verificando a correta emissão dos serviços de cobrança e estorno.