Você está na página 1de 20

Padres de Projeto

Padres Criacionais Abstract Factory

Abstract Factory
! Prov uma interface para criao de famlias de objetos relacionados ou dependentes sem especificar suas classes concretas ! Tambm conhecido como Kit

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Motivao

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

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

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Participantes
! AbstractFactory (WidgetFactory)
! Declara uma interface para operaes que criam objetos-produto abstratos

! ConcreteFactory (MotifWidgetFactory, PMWidgetFactory)


! Implementa as operaes para criar objetos-produto concretos

! AbstractProduct (Window, ScrollBar)


! Declara uma interface para um tipo de objeto-produto
7
Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

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

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

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

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

13

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo
! Para criar um labirinto com cmodos encantados, basta fazer subclasse de MazeFactory.

14

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

15

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

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

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo

18

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

Eduardo N. F. Zagari

Exemplo
! Para criar um labirinto que contenha bombas, basta chamar CreateMaze com um BombedMazeFactory

19

Livro Texto: Design Pattern - Elements of Reusable OO Software - Gamma

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