Padrões-08 - Padrões Criacionais - Abstract Factory
-
Upload
nicola-zagari -
Category
Technology
-
view
3.670 -
download
2
description
Transcript of Padrões-08 - Padrões Criacionais - Abstract Factory
Padrões de Projeto
Padrões Criacionais Abstract Factory
2 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
3 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Motivação
4 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
5 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
6 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Estrutura
7 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
8 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
9 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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.
10 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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
11 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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”
12 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
13 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
14 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
• Para criar um labirinto com cômodos encantados, basta fazer subclasse de MazeFactory.
15 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
16 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
• Para criar um labirinto que contenha cômodos encantados, basta chamar CreateMaze com um EnchantedMazeFactory:
MazeGame game;
EnchantedMazeFactory factory;
game.CreateMaze(factory);
17 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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...
18 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
19 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
• Para criar um labirinto que contenha bombas, basta chamar CreateMaze com um BombedMazeFactory
20 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
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 *