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

  • 3,557 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,557
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
157
Comments
0
Likes
2

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Padrões de Projeto Padrões Criacionais Factory Method
  • 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