AbstractFactory Flashcards

1
Q

Intenção

A

AbstractFactory é um design pattern criacional que deixa você produzir famílias de objetos relacionados sem especificar suas classes concretas

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

O problema

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Solução

A
  1. Todas as variantes devem implementar uma interface comum. (todas as variantes de Cadeira devem implementar a interface Cadeira)
  2. 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.
  3. Criar classes fábricas para retornar um produto específico, implementando os métodos de criação da AbstractFactory. (CadeiraEstiloVintageFactory)
  4. O código cliente deve se basear somente em interfaces.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Estrutura

A

Produtos Abstratos
Produtos Concretos
Fábrica Abstrata
Fábricas Concretas

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Estrutura: Produtos Abstratos

A

Declara a interface para todos as variações de produto dentro de uma familia de produtos.
Normalmente deve haver muitas interfaces diferentes de produtos.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Estrutura: Produtos Concretos

A

Implementam diferentes interfaces de Produtos Abstratos.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Estrutura: Fábrica Abstrata

A

Declara a interface para criação de todos os produtos de uma família

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Estrutura: Fábricas Concretas

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Como pode ser útil quando:

Uma classe tem muitos FactoryMethods que esconde sua responsabilidade principal

A

Quando uma classe lida com diferentes tipo de família de produtos é melho realocar os factorymethods para uma abstractfactory específica

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Pros

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Cons

A

Aumenta complexidade por criar muitas classes adicionais.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Refatorar para AbstractFactory

A
  1. Mapeie os distintos produtos contra suas distintas variações.
  2. Crie interfaces abstratas para todos os tipos de produtos e faça todos os produtos concretos implementar essas interfaces.
  3. Declare uma interface abstract factory. Essa interface deve listar todos os métodos para criação de todos os objetos.
  4. Implemente factories diferentes para cada variação da família do produto.
  5. 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.
  6. No código cliente troque todos os construtores pelo método fábrica .
How well did you know this?
1
Not at all
2
3
4
5
Perfectly