Boas práticas e padrões · Padrões de criação · 5 min de leitura
Factory Method e fábricas
Centraliza a decisão de qual classe concreta criar, para que o resto do código dependa só da interface.
Arraste para o lado para ver o diagrama inteiro.
O padrão
No GoF, Factory Method deixa subclasses decidirem qual objeto criar. No dia a dia, a forma mais comum é a fábrica simples: uma função ou objeto que recebe um parâmetro e devolve a implementação certa da interface. Em Kotlin, companion object com funções de(…) e sealed são muito usados.
Quando usar
- A criação tem lógica (configuração, feature flag, país do usuário).
- Você quer um único ponto para trocar implementações.
- O construtor precisa de nome melhor:
Dinheiro.deReais(10)é mais claro queDinheiro(1000).
No código
interface Pagamento { fun pagar(centavos: Long): Recibo }
class Pix(private val chave: String) : Pagamento { override fun pagar(centavos: Long) = Recibo("pix") }
class Cartao(private val gateway: Gateway) : Pagamento { override fun pagar(centavos: Long) = Recibo("cartao") }
class Boleto : Pagamento { override fun pagar(centavos: Long) = Recibo("boleto") }
class PagamentoFactory(private val chavePix: String, private val gateway: Gateway) {
fun criar(forma: Forma): Pagamento = when (forma) {
Forma.PIX -> Pix(chavePix)
Forma.CARTAO -> Cartao(gateway)
Forma.BOLETO -> Boleto()
}
} Com Forma como enum, o when é exaustivo: uma forma nova sem implementação vira erro de compilação, não de produção.
Em resumo
- Isola o new das classes concretas.
- Um lugar só para decidir a implementação.
- Funções de fábrica com nome deixam a intenção clara.
- Combine com injeção de dependência.