padrões-08 - padrões criacionais - abstract factory
DESCRIPTION
Padrões de Projeto. Padrão Criacional. Abstract Factory.TRANSCRIPT
![Page 1: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/1.jpg)
Padrões de Projeto
Padrões Criacionais Abstract Factory
![Page 2: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/2.jpg)
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
![Page 3: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/3.jpg)
3 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Motivação
![Page 4: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/4.jpg)
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
![Page 5: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/5.jpg)
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
![Page 6: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/6.jpg)
6 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Estrutura
![Page 7: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/7.jpg)
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
![Page 8: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/8.jpg)
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
![Page 9: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/9.jpg)
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.
![Page 10: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/10.jpg)
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
![Page 11: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/11.jpg)
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”
![Page 12: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/12.jpg)
12 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
![Page 13: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/13.jpg)
13 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
![Page 14: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/14.jpg)
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.
![Page 15: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/15.jpg)
15 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
![Page 16: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/16.jpg)
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);
![Page 17: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/17.jpg)
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...
![Page 18: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/18.jpg)
18 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
![Page 19: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/19.jpg)
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
![Page 20: Padrões-08 - Padrões Criacionais - Abstract Factory](https://reader031.vdocuments.pub/reader031/viewer/2022020720/549693d1ac7959132e8b517b/html5/thumbnails/20.jpg)
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 *