padrões-08 - padrões criacionais - abstract factory

20
Padrões de Projeto Padrões Criacionais Abstract Factory

Upload: nicola-zagari

Post on 18-Dec-2014

3.670 views

Category:

Technology


2 download

DESCRIPTION

Padrões de Projeto. Padrão Criacional. Abstract Factory.

TRANSCRIPT

Page 1: Padrões-08 - Padrões Criacionais - Abstract Factory

Padrões de Projeto

Padrões Criacionais Abstract Factory

Page 2: Padrões-08 - 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

Page 3: Padrões-08 - Padrões Criacionais - Abstract Factory

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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 *