AbstractFactory Flashcards
Intenção
AbstractFactory é um design pattern criacional que deixa você produzir famílias de objetos relacionados sem especificar suas classes concretas
O problema
Você têm uma família de produtos relacionados (Cadeira, Sofa, Mesa) e variações para esta família (EstiloVintage, EstiloFuturista).
Você precisa criar produtos relacionados e permitir que seja fácil criar novas classes de produtos
Solução
- Todas as variantes devem implementar uma interface comum. (todas as variantes de Cadeira devem implementar a interface Cadeira)
- Criar uma AbstractFactory. Uma interface que declara os métodos para criação de cada variação. (criarCadeira, criarSofa, criarMesa), sendo que na assinatura devem retornar as interfaces extraidas.
- Criar classes fábricas para retornar um produto específico, implementando os métodos de criação da AbstractFactory. (CadeiraEstiloVintageFactory)
- O código cliente deve se basear somente em interfaces.
Estrutura
Produtos Abstratos
Produtos Concretos
Fábrica Abstrata
Fábricas Concretas
Estrutura: Produtos Abstratos
Declara a interface para todos as variações de produto dentro de uma familia de produtos.
Normalmente deve haver muitas interfaces diferentes de produtos.
Estrutura: Produtos Concretos
Implementam diferentes interfaces de Produtos Abstratos.
Estrutura: Fábrica Abstrata
Declara a interface para criação de todos os produtos de uma família
Estrutura: Fábricas Concretas
Implementa os métodos de criação da classe Fábrica Abstrata.
Cada Fábrica Concreta corresponde a um variação específica na família de produtos.
Como pode ser útil quando:
Uma regra de negócio deve trabalhar com diferentes variações de produtos dentro de uma família de produtos, mas você não quer depender de produtos concretos
AbstractFactory esconde do código cliente informação sobre as classes de produtos que ele cria.
O código cliente pode trabalhar com qualquer produto criado por qualquer fábrica por estar trabalhando apenas com interfaces
Como pode ser útil quando:
Uma classe tem muitos FactoryMethods que esconde sua responsabilidade principal
Quando uma classe lida com diferentes tipo de família de produtos é melho realocar os factorymethods para uma abstractfactory específica
Pros
Segue o Open/Closed Principle.
Permite a construção de famílias de objetos e garante sua compatibilidade
Evita aclopamento entre produtos concretos e o códio que os usa.
Divide as responsabilidades entre multiplas classes.
Cons
Aumenta complexidade por criar muitas classes adicionais.
Refatorar para AbstractFactory
- Mapeie os distintos produtos contra suas distintas variações.
- Crie interfaces abstratas para todos os tipos de produtos e faça todos os produtos concretos implementar essas interfaces.
- Declare uma interface abstract factory. Essa interface deve listar todos os métodos para criação de todos os objetos.
- Implemente factories diferentes para cada variação da família do produto.
- Crie a inicialização da factory em algum lugar no código. Ele deve pegar o tipo e criar uma fábrica concreta dependendo do ambiente.
- No código cliente troque todos os construtores pelo método fábrica .