Factory Method + Spring Boot: um fluxo, várias implementações
Quando o código precisa decidir “qual implementação usar”, é comum aparecer um ponto central cheio de condicionais. Esse ponto vira gargalo de manutenção: quanto mais variações você adiciona, mais ele cresce e mais fácil é introduzir regressões.
O Factory Method resolve essa parte: você deixa o processo principal fixo e cria um ponto único onde a implementação concreta é escolhida. No Spring, dá pra deixar essa escolha com o container usando injeção + @Profile.
A ideia aqui é simples: o processo não muda, só muda “quem faz a leitura”.
O ponto de acoplamento no fluxo
onsidere este fluxo de importação:
- ler o arquivo
- validar o que veio
- persistir (ou enviar pra fila, chamar API, etc)
O problema aparece quando a etapa de leitura vira um “seletor” espalhado pelo código: if pra CSV, if pra JSON, instância pra cada caso. A cada formato novo, você precisa voltar e alterar esse mesmo ponto.
Em vez disso, vamos separar:
- Contrato do leitor (o que o processo precisa)
- Implementações (CSV, JSON)
- Pipeline fixo que chama um método fábrica pra obter o leitor certo
O contrato do “produto” (o que varia)


O pipeline só enxerga LeitorArquivo. Ele não precisa saber (e nem deveria) se aquilo é CSV, JSON, etc.
Implementações concretas (seleção por @Profile)

JSON

Ponto importante: as duas classes implementam o mesmo contrato, mas só uma fica ativa dependendo do profile.
O pipeline (Creator) + Factory Method
Agora entra o padrão: um pipeline com o fluxo fixo e um Factory Method que devolve o leitor “certo”.

Aqui você mantém o padrão: existe um método de criação (criarLeitor()), mas a decisão prática ficou com o Spring.
Executando o fluxo (exemplo com CommandLineRunner)

Selecionando CSV ou JSON
java -jar app.jar --spring.profiles.active=csv
java -jar app.jar --spring.profiles.active=json
Via application.yml:
spring:
profiles:
active: csv
Antes de ir pra produção
- Defina o profile: sem isso, não existe LeitorArquivo para injetar.
- Evite dois leitores ativos: se ativar mais de um profile, a injeção fica ambígua.
- Se a escolha for por arquivo: prefira lookup/registry em vez de profile.



