Este projeto demonstra a implementação do padrão de design Factory Method em Python, criando um sistema flexível para exportação de dados em diferentes formatos.
O sistema utiliza o Factory Pattern para criar exportadores de dados de forma dinâmica, permitindo a exportação de dados de vendas em múltiplos formatos (CSV, JSON) sem acoplar o código cliente às implementações específicas.
- Problema resolvido: Criação de objetos sem especificar suas classes concretas
- Benefícios:
- Baixo acoplamento entre cliente e produtos concretos
- Facilita adição de novos formatos de exportação
- Código mais limpo e manutenível
01_factory/
├── README.md # Documentação do projeto
├── run.py # Ponto de entrada da aplicação
└── src/ # Código fonte principal
├── __init__.py
├── data.py # Dados de exemplo para exportação
├── interfaces/ # Interfaces/Contratos do sistema
│ ├── __init__.py
│ └── interfaces.py
├── exporters/ # Implementações dos exportadores
│ ├── __init__.py
│ └── exporters.py
└── factories/ # Factories e seletor de factories
├── __init__.py
├── factories.py
└── handle_factories.py
IReporterExporter
: Define o contrato para exportadores de dadosIReporterFactory
: Define o contrato para factories de exportadores
JSONExporter
: Exporta dados no formato JSONCSVExporter
: Exporta dados no formato CSV
ExportJsonFactory
: Cria instâncias do JSONExporterExportCSVFactory
: Cria instâncias do CSVExporterhandle_exports_factories
: Seletor de factory baseado no tipo solicitado
python3 run.py
# Para testar JSON, edite o arquivo run.py e altere:
# export_type = "json"
Formato CSV:
Dados exportados em formato csv:
id_venda,produto,quantidade,preco_unitario
V001,Laptop Gamer,1,5500.0
V002,Mouse Vertical,2,180.5
V003,Teclado Mecânico,1,450.75
Formato JSON:
[
{
"id_venda": "V001",
"produto": "Laptop Gamer",
"quantidade": 1,
"preco_unitario": 5500.0
},
{
"id_venda": "V002",
"produto": "Mouse Vertical",
"quantidade": 2,
"preco_unitario": 180.5
}
]
from src.factories.handle_factories import handle_exports_factories
from src.data import dados_vendas
# Definir o formato desejado
formato = "csv" # ou "json"
# Obter a factory apropriada
factory = handle_exports_factories(formato)
# Processar e exportar os dados
resultado = factory.process_document(dados_vendas)
print(resultado)
Formato | Descrição | Exemplo de Saída |
---|---|---|
CSV | Comma-Separated Values | id_venda,produto,quantidade,preco_unitario\nV001,Laptop Gamer,1,5500.0 |
JSON | JavaScript Object Notation | [{"id_venda": "V001", "produto": "Laptop Gamer"}] |
Para adicionar um novo formato de exportação:
- Criar o exportador:
from src.interfaces.interfaces import IReporterExporter
from typing import List, Dict, Any
class XMLExporter(IReporterExporter):
def export(self, data: List[Dict[str, Any]]) -> str:
# Implementar lógica de exportação XML
pass
- Criar a factory:
from src.interfaces.interfaces import IReporterFactory
class ExportXMLFactory(IReporterFactory):
def factory_exporter(self) -> XMLExporter:
return XMLExporter()
- Adicionar ao seletor:
# Em handle_factories.py
factories = {
"csv": ExportCSVFactory(),
"json": ExportJsonFactory(),
"xml": ExportXMLFactory(), # Nova factory
}
- SOLID Principles: Especialmente Open/Closed Principle
- Dependency Inversion: Dependência de abstrações, não de concreções
- Single Responsibility: Cada classe tem uma única responsabilidade
- Type Hints: Código tipado para melhor manutenibilidade
- Python 3.8+
- Typing: Para type hints e melhor documentação do código
- ABC (Abstract Base Classes): Para definição de interfaces
- Flexibilidade: Fácil adição de novos formatos
- Manutenibilidade: Código bem estruturado e separado por responsabilidades
- Testabilidade: Cada componente pode ser testado independentemente
- Reutilização: Factories podem ser reutilizadas em diferentes contextos
-
Documentar código com docstrings - Adicionar testes unitários
- Implementar exportação para XML
- Adicionar configurações personalizáveis para cada formato
- Implementar logging para operações de exportação
- Criar CLI para uso em linha de comando
Este é um projeto educacional para demonstrar o Factory Pattern. Sugestões e melhorias são bem-vindas!
Este projeto é para fins educacionais e de estudo do padrão Factory Method.