padrões-09 - padrões criacionais - factory method

26
Padrões de Projeto Padrões Criacionais Factory Method

Upload: nicola-zagari

Post on 20-May-2015

3.918 views

Category:

Technology


0 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Padrões-09 - Padrões Criacionais - Factory Method

Padrões de Projeto

Padrões Criacionais Factory Method

Page 2: Padrões-09 - Padrões Criacionais - Factory Method

2 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Factory Method

• Define uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar.

•  Factory Method faz uma classe delegar a instanciação a subclasses

•  Também conhecido como Construtor Virtual

Page 3: Padrões-09 - Padrões Criacionais - Factory Method

3 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Motivação

•  Considere um framework para aplicações que possam apresentar múltiplos documentos ao usuário. – Duas abstrações-chave: classes Application e

Document (ambas abstratas). Clientes devem “especializá-las” para executar sua funcionalidade específica. P.ex.: DrawingApplication e DrawingDocument

– Problema: como a subclasse de Document é específica da aplicação, Application não consegue prever a subclasse que deve instanciar... (sabe apenas QUANDO e não QUAL Document criar)

Page 4: Padrões-09 - Padrões Criacionais - Factory Method

4 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Motivação

•  Dilema: o framework deve instanciar classes, mas ele somente conhece sobre classes abstratas, as quais ele não pode instanciar...

•  Solução: Factory Method. – Encapsula o conhecimento de qual subclasse

Document criar e move este conhecimento para fora do framework

– As subclasse de Application redefine uma operação de criação abstrata (Factory Method) e retorna a subclasse Document apropriada.

Page 5: Padrões-09 - Padrões Criacionais - Factory Method

5 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Motivação

Page 6: Padrões-09 - Padrões Criacionais - Factory Method

6 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Aplicação

• Use Factory Method quando: – Uma classe não pode antecipar a classe dos

objetos que ela deve criar – Uma classe quer que suas subclasses

especifiquem os objetos que elas criam

Page 7: Padrões-09 - Padrões Criacionais - Factory Method

7 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Estrutura

Page 8: Padrões-09 - Padrões Criacionais - Factory Method

8 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Participantes

•  Product (Document) – Define a interface dos objetos que o método

fábrica (Factory Method) cria • ConcreteProduct (MyDocument)

– Implementa a interface de Product

Page 9: Padrões-09 - Padrões Criacionais - Factory Method

9 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Participantes

•  Creator (Application) – Declara o método fábrica, o qual retorna um objeto do

tipo Product. Creator também pode definir uma implementação default do método fábrica, que retorne um objeto ConcreteProduct padrão

– Pode chamar o método fábrica para cirar um objeto Product

•  ConcreteCreator (MyApplication) – Sobrescreve o método fábrica para retornar uma

instância de um ConcreteProduct

Page 10: Padrões-09 - Padrões Criacionais - Factory Method

10 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Colaborações

• Creator confia a suas subclasses a definição do método fábrica, para que ele retorne uma instância do ConcreteProduct apropriado

Page 11: Padrões-09 - Padrões Criacionais - Factory Method

11 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Conseqüências

1.  Elimina a necessidade de ligar o código a classes específicas da aplicação

2.  Provê ganchos (hooks) para especialização (versão estendida de um objeto)

3.  Desvantagem potencial: eventualmente, clientes podem ter que especializar a classe Creator apenas para criar um objeto ConcreteProduct particular (um ponto de “evolução” adicional)

Page 12: Padrões-09 - Padrões Criacionais - Factory Method

12 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Conseqüências

4.  Conecta hierarquias de classes paralelas (quando uma classe delega algumas de suas responsabilidades a outra)

Page 13: Padrões-09 - Padrões Criacionais - Factory Method

13 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Conseqüências

• Diferentes figuras usam diferentes subclasses Manipulator para tratar interações particulares

• Note que o método fábrica define uma conexão entre as duas classes de hierarquia. Ele detém o conhecimento de quais classes se co-relacionam.

Page 14: Padrões-09 - Padrões Criacionais - Factory Method

14 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

•  Duas variantes principais: – Quando a classe Creator é uma classe abstrata e não

provê uma implementação para o método fábrica que ela declara

•  Dilema de se ter que instanciar classes imprevisíveis

– Quando Creator é uma classe concreta e provê uma implementação default para o método fábrica

•  Regra: “Crie objetos em uma operação separada para que as subclasses possam sobrescrever a forma como eles são criados”

Page 15: Padrões-09 - Padrões Criacionais - Factory Method

15 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

• Métodos fábrica parametrizados

Page 16: Padrões-09 - Padrões Criacionais - Factory Method

16 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação •  Sobrescrever métodos fábrica parametrizados é uma

forma fácil e seletiva de se estender ou mudar os produtos criados (pode-se introduzir novos identificadores ou mudar os já existentes)

Page 17: Padrões-09 - Padrões Criacionais - Factory Method

17 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

• Questões específicas de linguagem – Em C++, métodos fábricas são sempre

funções virtuais (ou virtuais puras). • Cuidado para não chamá-la do construtor da

classe criadora (Creator), pois o método fábrica na classe concreta pode não estar pronto ainda.

• Pode-se evitar isto através da técnica lazy initialization: acesse produtos através de operações de acesso que criem o produto sob demanda (o construtor apenas inicializa o produto com zero)

Page 18: Padrões-09 - Padrões Criacionais - Factory Method

18 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

Page 19: Padrões-09 - Padrões Criacionais - Factory Method

19 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação • Use templates para evitar subclasses

(especialização)

Page 20: Padrões-09 - Padrões Criacionais - Factory Method

20 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Implementação

•  Por fim, uma convenção de nomes – Sempre deixe claro que você está usando um

método fábrica (P.ex.: DoMakeDoc(), FactoryDoc() etc)

Page 21: Padrões-09 - Padrões Criacionais - Factory Method

21 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Page 22: Padrões-09 - Padrões Criacionais - Factory Method

22 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Page 23: Padrões-09 - Padrões Criacionais - Factory Method

23 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Jogos diferentes podem especializar partes do labirinto. As subclasses de MazeGame podem redefinir alguns ou todos os métodos fábrica para especificar variações dos produtos

Page 24: Padrões-09 - Padrões Criacionais - Factory Method

24 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Page 25: Padrões-09 - Padrões Criacionais - Factory Method

25 Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

Page 26: Padrões-09 - Padrões Criacionais - Factory Method

26 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 de um EnchantedMazeGame:

EnchantedMazeGame game;

game.CreateMaze();