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
- Implementação completa das interfaces e classes concretas da fábrica abstrata.
- Demonstração do código cliente consumindo as fábricas de forma transparente.
- Testes unitários verificando a correta emissão dos serviços de cobrança e estorno.