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

4,899 views

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,899
On SlideShare
0
From Embeds
0
Number of Embeds
46
Actions
Shares
0
Downloads
201
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 1. Padrões de Projeto Padrões Criacionais Factory Method
  2. 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. 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. 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. 5. Motivação 5 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  6. 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. 7. Estrutura 7 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  8. 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. 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. 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. 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. 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. 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. 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. 15. Implementação •  Métodos fábrica parametrizados 15 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  16. 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. 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. 18. Implementação 18 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  19. 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. 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. 21. Exemplo 21 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  22. 22. Exemplo 22 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  23. 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. 24. Exemplo 24 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  25. 25. Exemplo 25 Livro Texto: Design Pattern - Elements Eduardo N. F. Zagari of Reusable OO Software - Gamma
  26. 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

×