O padrão Abstract Factory fornece uma interface para criar famílias de objetos relacionados sem especificar suas classes concretas. Ele promove a consistência entre produtos e facilita a permuta entre famílias de produtos. O padrão também isola classes concretas para facilitar a adição de novos tipos de produtos.
2. Abstract Factory
• Provê uma interface para criação de
famílias de objetos relacionados ou
dependentes sem especificar suas
classes concretas
• Também conhecido como Kit
2 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
3. Motivação
3 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
4. Motivação
• Considere uma interface de usuário que suporte
múltiplos look-and-feel.
– Para ser portável, uma aplicação não deveria se
referir aos elementos (widgets) de um padrão
particular de forma hard-code
– Solução:
• WidgetFactory – uma interface para criar cada tipo básico de
elementos
• Uma classe abstrata para cada tipo de widget
• Uma subclasse concreta para cada padrão distinto
• Clientes usam a WidgetFactory e não têm conhecimento das
classes que implementam widgets particulares
• WidgetFactory assegura também consistência entre classes
4 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
5. Aplicação
• Use Abstract Factory quando:
– O sistema deve ser independente de como seus
produtos são criados, compostos e representados
– O sistema deve ser configurado com uma ou com
múltiplas famílias de produtos
– Uma família de objetos de produtos relacionados é
projetada para ser usada de forma conjunta e você
deva garantir esta restrição
– Você quer prover uma biblioteca de classes de
produtos e quer revelar apenas suas interfaces e não
suas implementações
5 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
6. Estrutura
6 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
7. Participantes
• AbstractFactory (WidgetFactory)
– Declara uma interface para operações que criam
objetos-produto abstratos
• ConcreteFactory (MotifWidgetFactory,
PMWidgetFactory)
– Implementa as operações para criar objetos-produto
concretos
• AbstractProduct (Window, ScrollBar)
– Declara uma interface para um tipo de objeto-produto
7 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
8. Participantes
• ConcreteProduct (MotifWindow,
MotifScrollBar)
– Define um objeto-produto a ser criado pela
fábrica concreta correspondente
– Implementa a interface AbstractProduct
• Cliente
– Usa somente as interfaces declaradas pelas
classes AbstractFactory e AbstractProduct
8 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
9. Colaborações
• AbstractFactory delega a criação de
objetos-produto a suas subclasses
ConcreteFactory.
• Normalmente uma única instância da
classe ConcreteFactory é criada. Para
criar objetos-produto diferentes, os
clientes devem usar uma fábrica concreta
diferente.
9 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
10. Conseqüências
1. Isola classes concretas
2. Facilita a permuta de famílias de
produtos
3. Promove consistência entre produtos
4. Dificulta o suporte a novos tipos de
produtos
10 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
11. Implementação
• Fábricas geralmente são melhor
implementadas como Singletons
• AbstractFactory deve apenas declarar
uma interface para a criação de produtos.
É necessário haver uma fábrica concreta
(eventualmente, uma para cada famíla de
produtos)
• Definir fábricas “extensíveis”
11 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
12. Exemplo
12 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
13. Exemplo
13 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
14. Exemplo
• Para criar um labirinto com cômodos
encantados, basta fazer subclasse de
MazeFactory.
14 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
15. Exemplo
15 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
16. Exemplo
• Para criar um labirinto que contenha
cômodos encantados, basta chamar
CreateMaze com um
EnchantedMazeFactory:
MazeGame game;
EnchantedMazeFactory factory;
game.CreateMaze(factory);
16 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
17. Exemplo
• Agora, suponha que se queira fazer um
labirinto no qual o cômodo pode ter uma
bomba e a parede pode ser/estar
danificada por ela.
• Deve-se fazer subclasses novamente,
sobrescrevendo os dois métodos...
17 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
18. Exemplo
18 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
19. Exemplo
• Para criar um labirinto que contenha
bombas, basta chamar CreateMaze com
um BombedMazeFactory
19 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
20. Notas
• Note que MazeFactory é apenas uma
coleção de métodos fábrica
• Note também que ela é tanto uma
AbstractFactory como uma
ConcreteFactory
• Se um RoomWithABomb tiver que
acessar um membro de um BombedWall,
então ele deveria fazer um cast da
referência de Wall * para BombedWall *
20 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma