Escolar Documentos
Profissional Documentos
Cultura Documentos
2 - Gof - Abstract - Factory
2 - Gof - Abstract - Factory
Um Pequeno Labirinto
Um Pequeno Labirinto
Um Pequeno Labirinto
public interface ElementoDeLabirinto {
public void entra();
}
Exemplo: se voc estiver numa sala e quiser
implementar a operao "v para o Leste", o jogo
determina qual ElementoDeLabirinto est do lado Leste
e chama entra() deste objeto.
O mtodo entra() da subclasse especfica determina
o que ocorre
entra() poderia aceitar o objeto jogador como
parmetro
Sala a classe que implementa ElementoDeLabirinto e
define as relaes-chave entre objetos
Mantm
referncias
para
4
outros
ElementoDeLabirinto
2
Armazena um nmero de sala para identificar as
salas do labirinto
Um Pequeno Labirinto
Um Pequeno Labirinto
O Problema:
O problema desta soluo sua
inflexibilidade
O mtodo montaLabirinto() no
reutilizvel em outras situaes
Motivo: montaLabirinto() mistura a
questo da estrutura do labirinto com
a questo dos tipos exatos de
elementos que compem o labirinto
new cria um forte acoplamento
entre a classe Jogo e as classes dos
objetos criados porque implica num
2
compromisso (amarrao) com
uma
determinada
O Problema:
A Soluo:
Veremos agora como mudar o projeto para
criar diferentes tipos de labirintos
Labirintos encantados
Com portas travadas que precisam de
um encantamento para abrir
Salas contendo encantamentos que
podem ser apanhados
Labirintos perigosos
Salas com bombas que podem ser
explodidas para danificar as paredes (e
talvez o jogador!)
2
A Soluo:
Como
alterar
montaLabirinto()
para
facilmente criar estes novos tipos de
labirintos?
O maior problema que a soluo atual
nos fora a colocar em cdigo as classes
concretas que sero instanciadas
Usaremos padres de criao para tornar o
projeto mais flexvel (mais reusvel)
Objetivo
Definir uma interface para criar
objetos de forma a deixar subclasses
decidirem qual classe instanciar
Factory Method deixa que subclasses
faam a instanciao
Tambm conhecido como
Construtor Virtual
Estrutura Genrica
Estrutura Genrica
Participantes
Produto: define a interface dos objetos criados pelo
Factory Method
ProdutoConcreto: implementa a interface Produto
Criador: declara o Factory Method que retorna um
objeto do tipo Produto
s vezes, o Criador no apenas uma interface
mas pode envolver uma classe concreta que tenha
uma implementao default para o Factory Method
para
retornar
um
objeto
com
algum
tipo
ProdutoConcreto default
Pode chamar o Factory Method para criar um produto
do tipo Produto
CriadorConcreto: faz override do Factory Method para
2
retornar
uma instncia de ProdutoConcreto
Estrutura Genrica
Colaboraes
Criador depende de suas subclasses para
definir o Factory Method para que ele
retorne uma instncia do ProdutoConcreto
apropriado
Exerccio:
Como estruturar o cdigo de uma
aplicao bancria para que voc no
fique maluco quando seu gerente pedir
que todas as novas contas de poupana
criadas a partir de segunda-feira tenham
algo novo implementado nelas mas sem
afetar cdigo antigo que trata das contas
antigas?
2
Consideraes de
implementao
boa prtica usar uma conveno de
nomes para alertar para o fato de que
se est usando Factory Methods
Exemplo: makeAbc(), makeXyz()
Exemplo: criaAbc(), criaXyz()
Comparando o diagrama de
objetos com a verso inicial, no
h objeto adicional
As nicas diferenas entre
umJogo e umJogoPerigoso so
as paredes e salas a serem
construdas.
Para criar um jogo encantado,
procedemos de forma anloga
2
Pergunta
final
para
discusso
De que forma a Factory
Method ajuda a produzir
cdigo fracamente acoplado?
Abstract Factory
Exemplo: Look-and-feels
(GUIs)
Exemplo: Look-and-feels
(GUIs)
Java j resolveu este problema usando
Abstract Factory.
Uma classe (abstrata) (ou interface, em Java)
"Abstract Factory" define uma interface para
criar cada tipo de objeto bsico (widgets)
Tambm tem uma classe abstrata para cada
tipo de widget (window, scroll bar, menu, ...)
H classes concretas para implementar cada
widget em cada plataforma (look-and-feel)
Exemplo: Look-and-feels
(GUIs)
Abstract Factory
Abstract Factory
11
!"#
!"#
14
!"#
15
!"#
16
!"#
17
!"#
18
!"#
19
20