2. 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
2 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
3. 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)
3 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
4. 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.
4 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
5. Motivação
5 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
6. 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
6 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
7. Estrutura
7 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
8. Participantes
• Product (Document)
– Define a interface dos objetos que o método
fábrica (Factory Method) cria
• ConcreteProduct (MyDocument)
– Implementa a interface de Product
8 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
9. 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
9 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
10. 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
10 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
11. 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)
11 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
12. Conseqüências
4. Conecta hierarquias de classes paralelas
(quando uma classe delega algumas de
suas responsabilidades a outra)
12 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
13. 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.
13 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
14. 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”
14 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
15. Implementação
• Métodos fábrica parametrizados
15 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
16. 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)
16 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
17. 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)
17 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
18. Implementação
18 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
19. Implementação
• Use templates para evitar subclasses
(especialização)
19 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
20. 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)
20 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
21. Exemplo
21 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
22. Exemplo
22 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
23. 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
23 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
24. Exemplo
24 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
25. Exemplo
25 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma
26. Exemplo
• Para criar um labirinto que contenha
cômodos encantados, basta chamar
CreateMaze de um
EnchantedMazeGame:
EnchantedMazeGame game;
game.CreateMaze();
26 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari
of Reusable OO Software - Gamma