Factory Method × Abstract Factory

Dois padrões que costumam ser trocados um pelo outro, e o que de fato os separa.

Em uma frase

Factory Method cria um produto e a variação vem de herança — a subclasse decide o que instanciar. Abstract Factory cria uma família de produtos que precisam combinar entre si, e a variação vem de composição — você injeta a fábrica inteira.

Critério a critério

  • Quantos produtos?

    Factory Method
    Um. O método devolve um objeto, e é isso.
    Abstract Factory
    Vários, relacionados. A fábrica tem um método por produto da família.
  • De onde vem a variação?

    Factory Method
    De herança: a subclasse sobrescreve o método de criação.
    Abstract Factory
    De composição: você recebe a fábrica pronta e chama os métodos dela.
  • O que o padrão garante?

    Factory Method
    Que quem chama não precisa conhecer a classe concreta do produto.
    Abstract Factory
    Isso, mais a coerência entre os produtos: nunca sai um botão do tema claro com um menu do escuro.
  • Quando a escolha acontece?

    Factory Method
    Ao escolher a subclasse — normalmente em tempo de compilação.
    Abstract Factory
    Ao escolher a fábrica — normalmente em tempo de execução, na composição da aplicação.
  • O que o cliente segura?

    Factory Method
    A própria classe que contém o método de criação.
    Abstract Factory
    Uma referência à interface da fábrica, guardada e reutilizada.
  • Como cresce?

    Factory Method
    Produto novo, subclasse nova.
    Abstract Factory
    Produto novo na família obriga a mexer na interface e em todas as fábricas — é o custo de garantir coerência.

Quando escolher cada um

Factory Method

Existe um único tipo de produto e a subclasse já sabe, pelo contexto, qual variante criar.

Ver o conceito completo

Abstract Factory

Existem vários produtos que só fazem sentido juntos, e misturar variantes é um erro que precisa ser impossível.

Ver o conceito completo

Por que confundem

Abstract Factory costuma ser descrita como 'uma fábrica de fábricas', o que confunde mais do que ajuda — na prática ela é uma interface com vários métodos de criação, e cada um deles é um Factory Method. Por isso os dois aparecem juntos: Abstract Factory é frequentemente implementada com Factory Methods, e não uma alternativa a eles. A pergunta que separa é a coerência: se dois produtos precisam ter vindo da mesma família, é Abstract Factory; se um produto basta, o método já resolve.