Tópico 06 - Factory Method

Tópico 06: Factory Method

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

O que é Factory Method?

Padrão criacional que:

  • Define um método de criação (factory method)
  • Deixa subclasses decidirem qual classe concreta instanciar
  • Faz o código cliente depender de abstrações, não de new Concreto()

Objetivo: desacoplar criação do uso.

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Problema: acoplamento ao concreto

public void planejarEntrega() {
  Caminhao c = new Caminhao();
  c.entregar();
}

Quando surge Navio, Aviao, etc.:

  • aparece if/else/switch
  • alterações frequentes em código já testado
  • difícil testar (sem mocks)
  • extensão vira “caçar new no projeto”
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Ideia principal

Separar:

  • fluxo principal (o que fazer)
  • decisão de criação (qual objeto usar)

O Creator chama:

  • criarTransporte() (factory method)
  • e usa o resultado via interface Transporte
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Analogia: Logística

  • Mesmo processo:

    1. planejar entrega
    2. escolher transporte
    3. entregar
  • Variações:

    • Rodoviária → Caminhao
    • Marítima → Navio

Mesma lógica, produto criado muda.

Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Estrutura (visão geral)

  • Product: Transporte
  • ConcreteProduct: Caminhao, Navio
  • Creator: Logistica (tem planejarEntrega())
  • ConcreteCreator: LogisticaRodoviaria, LogisticaMaritima
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Exemplo (1/2) — Product + Concretos

public interface Transporte {
  void entregar();
}

public class Caminhao implements Transporte {
  public void entregar() { System.out.println("Entrega por caminhão"); }
}

public class Navio implements Transporte {
  public void entregar() { System.out.println("Entrega por navio"); }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Exemplo (2/2) — Creator + Subclasses

public abstract class Logistica {
  public void planejarEntrega() {
    Transporte t = criarTransporte();
    t.entregar();
  }
  protected abstract Transporte criarTransporte();
}

public class LogisticaRodoviaria extends Logistica {
  protected Transporte criarTransporte() { return new Caminhao(); }
}

public class LogisticaMaritima extends Logistica {
  protected Transporte criarTransporte() { return new Navio(); }
}
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Uso

Logistica l1 = new LogisticaRodoviaria();
l1.planejarEntrega();

Logistica l2 = new LogisticaMaritima();
l2.planejarEntrega();
  • planejarEntrega() não muda
  • o tipo concreto é decidido pela subclasse
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Quando usar?

  • seu código precisa criar objetos, mas não deve conhecer classes concretas
  • há chance real de novos tipos surgirem
  • você quer aplicar OCP (estender sem modificar)
  • criação tem regras/variações por ambiente, por cliente, por contexto
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Uso com o Builder

LogisticaFactory factory = new LogisticaRodoviariaFactory();
factory.caminhao()
       .setCapacidade(1000)
       .setDestino("Cidade A")
       .build()
       .entregar();
  • Factory Method pode criar Builders
  • Ex.: Logistica pode ter criarBuilder() que retorna um TransporteBuilder
  • O Builder pode ter variações (ex.: CaminhaoBuilder, NavioBuilder)
  • Combinação poderosa para objetos complexos com variações
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Prós

  • Menos acoplamento a classes concretas
  • Facilita extensão (novos produtos)
  • Centraliza decisão de criação
  • Melhora testabilidade (depender de abstrações)
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Contras

  • Mais classes (Creator/ConcreteCreator)
  • Pode ser overengineering para casos simples
  • Requer disciplina para manter a estrutura clara
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Relação com outros padrões

  • Abstract Factory: famílias de objetos (nível acima)
  • Template Method: o Creator parece um “template”, e o factory method é ponto de variação
  • Builder: constrói passo a passo; Factory Method cria “de uma vez”
Design Patterns - Professor Ramon Venson - SATC 2026.1
Tópico 06 - Factory Method

Resumo

  • Factory Method = subclasses escolhem o que instanciar
  • Melhora:
    • extensibilidade
    • desacoplamento
    • manutenção
  • Use quando houver variação real de “produtos” e risco de mudanças futuras
Design Patterns - Professor Ramon Venson - SATC 2026.1