O Abstract Factory é um padrão de projeto criacional que permite que você produza famílias de objetos relacionados ou dependentes sem ter que especificar suas classes concretas.
Imagine uma fábrica de móveis: você precisa de uma cadeira, um sofá e uma mesa de centro. Esses produtos devem combinar entre si (por exemplo, todos do estilo Moderno, ou todos do estilo Vitoriano). O padrão Abstract Factory garante que, se você pedir uma cadeira Moderna, também receberá um sofá Moderno, mantendo a consistência do estilo.
O padrão define uma interface para criar cada produto distinto (ex: criarCadeira, criarSofa). As fábricas concretas (ex: FabricaModerna, FabricaVitoriana) implementam esses métodos para produzir produtos de uma família específica. O código cliente trabalha apenas com as interfaces abstratas, o que o torna independente das classes concretas dos produtos que utiliza.
- Independência de criação: Quando seu código precisa trabalhar com várias famílias de produtos relacionados, mas você não quer que ele dependa das classes concretas desses produtos.
- Consistência: Quando você quer garantir que os produtos de uma mesma família sejam usados juntos. O padrão força o uso de produtos compatíveis.
- Bibliotecas e Frameworks: Quando você fornece uma biblioteca de classes de produtos e quer revelar apenas suas interfaces, não suas implementações.
- Complexidade desnecessária: Se você não tem famílias de produtos ou se a lógica de criação é muito simples, o padrão pode introduzir complexidade desnecessária com muitas interfaces e classes.
- Evolução difícil: Adicionar novos tipos de produtos (ex: adicionar uma "Luminária" à família de móveis) exige alterar a interface da Abstract Factory e todas as suas subclasses, o que pode ser trabalhoso se houver muitas fábricas.
-
Interface Gráfica Multiplataforma (UI Toolkit):
- Imagine que você está desenvolvendo um aplicativo que deve rodar em Windows, macOS e Linux.
- Você precisa criar botões, caixas de texto e menus que tenham a aparência nativa de cada sistema operacional.
- Uma
GUIFactoryabstrata define métodos comocriarBotao()ecriarMenu(). - Uma
WindowsFactorycriaWindowsButtoneWindowsMenu. - Uma
MacOSFactorycriaMacOSButtoneMacOSMenu. - O cliente pede os componentes à fábrica sem saber qual OS está rodando, garantindo que nunca misture um botão do Windows com um menu do macOS.
-
Temas de Aplicação:
- Um sistema que suporta temas "Claro" e "Escuro".
- A fábrica "Claro" produz componentes com cores claras e fontes escuras.
- A fábrica "Escuro" produz componentes com fundos escuros e fontes claras.
-
Conexão com Banco de Dados:
- Uma aplicação que precisa suportar diferentes bancos de dados (MySQL, PostgreSQL, Oracle).
- A fábrica cria conexões, comandos e leitores de dados específicos para o banco escolhido, garantindo que uma conexão MySQL não tente executar um comando formatado para Oracle.