Pular para o conteúdo

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.

Checkout → PagamentoFactory: criar("pix")criar("pix")1PagamentoFactory → Pix: newnew2PagamentoFactory → CartãoPagamentoFactory → BoletoCheckout — pede "pix"Checkoutpede "pix"PagamentoFactory — decidePagamentoFactorydecidePixPixCartãoCartãoBoletoBoleto

Arraste para o lado para ver o diagrama inteiro.

O checkout não conhece as classes concretas: pede um Pagamento e recebe o certo para a forma escolhida.

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 que Dinheiro(1000).

No código

✓ ExemploKotlin
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

Referências

Continue aprendendo

Todos os temas de boas práticas e padrões →