Padrão Factory Method
Defina um método de fábrica em uma classe-base e permita que as subclasses decidam qual produto criar.
Padrão Factory Method é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
A intenção do Método de Fábrica
O Método de Fábrica define uma interface para criar um objeto, mas permite que as subclasses decidam qual classe instanciar. Ele desacopla a lógica de criação do código cliente.
O problema sem o Método de Fábrica
Sem uma fábrica, o código cliente fica repleto de chamadas new ConcreteClass(). Adicionar uma nova variante significa alterar todos os pontos de chamada — uma violação do Princípio Aberto/Fechado.
// Client knows too much:
Shape shape;
if (type.equals("circle")) shape = new Circle(r);
else if (type.equals("rect")) shape = new Rectangle(w, h);
// Every new shape requires editing this code.A classe criadora abstrata
Defina uma classe criadora abstrata com um método de fábrica createProduct(). As subclasses o sobrescrevem para retornar tipos específicos de produto.
public abstract class Dialog {
public void render() {
Button btn = createButton(); // factory method
btn.onClick();
}
protected abstract Button createButton();
}Criadores concretos
Cada subclasse sobrescreve o método de fábrica para retornar o produto apropriado sem alterar o algoritmo ao redor na classe base.
public class WindowsDialog extends Dialog {
@Override
protected Button createButton() { return new WindowsButton(); }
}
public class WebDialog extends Dialog {
@Override
protected Button createButton() { return new HtmlButton(); }
}A interface do produto
Todos os produtos concretos implementam uma interface comum para que o criador possa trabalhar com eles de forma genérica.
public interface Button {
void onClick();
void render();
}
public class WindowsButton implements Button {
public void onClick() { System.out.println("Windows click"); }
public void render() { System.out.println("Render Windows button"); }
}Métodos de fábrica estáticos versus o padrão Método de Fábrica
Um método de fábrica estático (por exemplo, LocalDate.of()) é uma convenção de nomenclatura, não o padrão da GoF. O padrão da GoF usa herança; as fábricas estáticas usam métodos estáticos em uma única classe.
// Static factory (NOT the GoF pattern)
LocalDate d = LocalDate.of(2024, 6, 15);
// GoF Factory Method uses a class hierarchyMétodo de Fábrica parametrizado
Passe um parâmetro ao método de fábrica para escolher entre vários produtos sem exigir uma subclasse para cada produto.
public class ShapeFactory {
public static Shape create(String type, double... dims) {
return switch (type) {
case "circle" -> new Circle(dims[0]);
case "rectangle" -> new Rectangle(dims[0], dims[1]);
default -> throw new IllegalArgumentException("Unknown: " + type);
};
}
}Método de Fábrica com genéricos
Utilize genéricos para tornar o método de fábrica seguro quanto aos tipos e reutilizável entre diferentes famílias de produtos.
public abstract class Repository<T, ID> {
public abstract T findById(ID id);
protected abstract T createEmpty(); // factory method
}Registrando fábricas com um mapa
Uma fábrica baseada em registro armazena um mapa de strings de tipo para expressões lambda Supplier, evitando cadeias de if-else e tornando o registro dinâmico.
Map<String, Supplier<Notification>> registry = new HashMap<>();
registry.put("email", EmailNotification::new);
registry.put("sms", SmsNotification::new);
Notification n = registry.getOrDefault(type, DefaultNotification::new).get();Método de Fábrica versus Fábrica Abstrata
O Método de Fábrica cria um tipo de produto por meio de herança. A Fábrica Abstrata cria famílias de produtos relacionados por meio de composição. Utilize o Método de Fábrica quando um produto variar; utilize a Fábrica Abstrata quando uma suíte inteira variar em conjunto.
Exemplo do mundo real: fábrica de Logger
A LoggerFactory.getLogger(Class) da SLF4J é uma fábrica estática que retorna a implementação correta de Logger (Logback, Log4j, JUL) sem que o chamador saiba qual é.
Logger log = LoggerFactory.getLogger(MyService.class);
log.info("Service started");Verificação rápida
Qual é a principal característica do padrão Método de Fábrica?
Recapitulação
O Método de Fábrica desacopla a criação de objetos do cliente, colocando a decisão de instanciação em métodos substituíveis das subclasses. Utilize-o quando uma classe não puder antecipar quais objetos precisará criar.
Perguntas Frequentes
A aula “Padrão Factory Method” é grátis?
Sim — o texto completo de “Padrão Factory Method” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Padrão Factory Method”?
Defina um método de fábrica em uma classe-base e permita que as subclasses decidam qual produto criar. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Padrão Factory Method”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Singleton: Implementações Seguras para Threads
- Padrão Factory Method
- Abstract Factory para Famílias de Produtos
- Padrão Builder com API Fluente