Escolar Documentos
Profissional Documentos
Cultura Documentos
Abstract Factory
! Prov uma interface para criao de famlias de objetos relacionados ou dependentes sem especificar suas classes concretas ! Tambm conhecido como Kit
Eduardo N. F. Zagari
Motivao
Eduardo N. F. Zagari
Motivao
! Considere uma interface de usurio que suporte mltiplos look-and-feel.
! Para ser portvel, uma aplicao no deveria se referir aos elementos (widgets) de um padro particular de forma hard-code ! Soluo:
! WidgetFactory uma interface para criar cada tipo bsico de elementos ! Uma classe abstrata para cada tipo de widget ! Uma subclasse concreta para cada padro distinto ! Clientes usam a WidgetFactory e no tm conhecimento das classes que implementam widgets particulares ! WidgetFactory assegura tambm consistncia entre classes
4
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Aplicao
! Use Abstract Factory quando:
! O sistema deve ser independente de como seus produtos so criados, compostos e representados ! O sistema deve ser configurado com uma ou com mltiplas famlias de produtos ! Uma famlia de objetos de produtos relacionados projetada para ser usada de forma conjunta e voc deva garantir esta restrio ! Voc quer prover uma biblioteca de classes de produtos e quer revelar apenas suas interfaces e no suas implementaes
5
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Estrutura
Eduardo N. F. Zagari
Participantes
! AbstractFactory (WidgetFactory)
! Declara uma interface para operaes que criam objetos-produto abstratos
Eduardo N. F. Zagari
Participantes
! ConcreteProduct (MotifWindow, MotifScrollBar)
!Define um objeto-produto a ser criado pela fbrica concreta correspondente !Implementa a interface AbstractProduct
! Cliente
!Usa somente as interfaces declaradas pelas classes AbstractFactory e AbstractProduct
8
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Colaboraes
! AbstractFactory delega a criao de objetos-produto a suas subclasses ConcreteFactory. ! Normalmente uma nica instncia da classe ConcreteFactory criada. Para criar objetos-produto diferentes, os clientes devem usar uma fbrica concreta diferente.
9
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Conseqncias
1.! Isola classes concretas 2.! Facilita a permuta de famlias de produtos 3.! Promove consistncia entre produtos 4.! Dificulta o suporte a novos tipos de produtos
10
Eduardo N. F. Zagari
Implementao
! Fbricas geralmente so melhor implementadas como Singletons ! AbstractFactory deve apenas declarar uma interface para a criao de produtos. necessrio haver uma fbrica concreta (eventualmente, uma para cada famla de produtos) ! Definir fbricas extensveis
11
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
12
Eduardo N. F. Zagari
Exemplo
13
Eduardo N. F. Zagari
Exemplo
! Para criar um labirinto com cmodos encantados, basta fazer subclasse de MazeFactory.
14
Eduardo N. F. Zagari
Exemplo
15
Eduardo N. F. Zagari
Exemplo
! Para criar um labirinto que contenha cmodos encantados, basta chamar CreateMaze com um EnchantedMazeFactory:
MazeGame game; EnchantedMazeFactory factory; game.CreateMaze(factory);
16
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari
Exemplo
! Agora, suponha que se queira fazer um labirinto no qual o cmodo pode ter uma bomba e a parede pode ser/estar danificada por ela. ! Deve-se fazer subclasses novamente, sobrescrevendo os dois mtodos...
17
Eduardo N. F. Zagari
Exemplo
18
Eduardo N. F. Zagari
Exemplo
! Para criar um labirinto que contenha bombas, basta chamar CreateMaze com um BombedMazeFactory
19
Eduardo N. F. Zagari
Notas
! Note que MazeFactory apenas uma coleo de mtodos fbrica ! Note tambm que ela tanto uma AbstractFactory como uma ConcreteFactory ! Se um RoomWithABomb tiver que acessar um membro de um BombedWall, ento ele deveria fazer um cast da referncia de Wall * para BombedWall *
20
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma
Eduardo N. F. Zagari