Padrões-09 - Padrões Criacionais - Factory Method

zagari 3,679 views 26 slides Mar 29, 2010
Slide 1
Slide 1 of 26
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26

About This Presentation

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


Slide Content

Padrões de Projeto
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

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)

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.

5 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Motivação

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

7 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Estrutura

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

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

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

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)

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)

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.

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”

15 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Implementação
• Métodos fábrica parametrizados

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)

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)

18 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Implementação

19 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Implementação
• Use templates para evitar subclasses
(especialização)

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)

21 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo

22 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo

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

24 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo

25 Livro Texto: Design Pattern - Elements
of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo

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:
Enchanted MazeGame game;
game.CreateMaze();