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 completoAbstract Factory
Existem vários produtos que só fazem sentido juntos, e misturar variantes é um erro que precisa ser impossível.
Ver o conceito completoPor 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.