Você está na página 1de 56

Padro Factory Method

Padro Factory Method


Introduo aos Padres de Criao: Construindo
Labirintos
GoF classifica os padres em Padres de Criao,
Estruturais e de Comportamento.
Padres de criao abstraem o processo de
instanciao de objetos.
Usaremos a construo de labirintos para um jogo
via computador para mostrar alguns padres de
criao.
Ignoraremos muitos detalhes do labirinto (o que
pode estar no labirinto, os jogadores, etc.) .
Foco na criao dos labirintos.
2

Padro Factory Method

Um labirinto um conjunto de salas


Uma sala conhece seus quatro vizinhos
Vizinhos podem ser outra sala, uma parede ou
uma porta para outra sala
As classes importantes so Sala, Porta e Parede
S trataremos as partes das classes que
interessam para a criao do labirinto

Padro Factory Method

Um Pequeno Labirinto

Um Pequeno Labirinto

Cada sala tem quatro vizinhos


Usamos Norte, Sul, Leste, Oeste para
referenci-los
A interface ElementoDeLabirinto
implementada por todos os componentes de
um labirinto
Tem um mtodo entra() cujo significado
depende onde se est entrando
Se for uma sala, a localizao do jogador
muda
Se for uma porta aberta, voc vai para
outra sala, caso contrrio se machuca
2
Se for uma parede, voc se machuca

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

Tambm precisamos de uma classe


Labirinto para representar uma coleo
de salas. A classe Labirinto pode
localizar uma sala dado seu nmero
com o mtodo getSala()

Tambm definimos uma classe Jogo que


cria o labirinto.
Uma forma simples de criar um labirinto
de criar os objetos, adicion-los ao
labirinto e interconect-los
Exemplo da criao de um labirinto com
2 salas e uma porta entre elas

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)

O padro Factory Method

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

O padro Factory Method


Resumo
A idia simples: ao invs de um cliente, que precisa de
um determinado objeto, chamar new e assim especificar
a classe concreta que ele instancia, o cliente chama um
mtodo abstrato (Factory Method) especificado
em alguma classe abstrata (ou interface) e a
subclasse concreta vai decidir que tipo exato de objeto
criar e retornar.
Mudar a subclasse concreta que cria o objeto permite
mudar a classe do objeto criado sem que o cliente
saiba.
Permite estender a funcionalidade atravs da
construo de subclasses sem afetar os clientes.
Resumindo:
Crie objetos numa operao separada de forma
2 que subclasses possam fazer override da forma
de criao

O padro Factory Method


Quando usar o padro Factory Method?
Quando uma classe (o criador) no pode
antecipar a classe dos objetos que deve criar;
Quando uma classe quer que suas subclasses
especifiquem os objetos criados;
Quando classes delegam responsabilidade para
uma entre vrias subclasses de apoio e
queremos localizar num ponto nico a
conhecimento de qual subclasse est sendo
usada,
2

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

Consequncias do uso do padro Factory


Method

Factory Methods eliminam a necessidade de


colocar classes especficas da aplicao no
cdigo
O cdigo s lida com a interface Produto
O cdigo pode portanto funcionar com
qualquer classe ProdutoConcreto
Prov ganchos para subclasses
Criar objetos dentro de uma classe com um
Factory Method sempre mais flexvel do que
criar objetos diretamente
O Factory Method prov um gancho para que
subclasses forneam uma verso estendida de
um objeto
2

Consequncias do uso do padro Factory


Method

Exemplo num editor de documentos


Uma classe Documento poderia ter um
Factory Method criaFileDialog para criar um
objeto file dialog default para abrir um
documento existente
Uma subclasse de Documento poderia criar
um file dialog especial atravs do override
do Factory Method default
Neste caso, o Factory Method no
abstrato mas fornece um default razovel

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()

Exemplo de cdigo: criao de


labirintos

A criao de labirintos j vista no


ficou flexvel pois criamos (com new)
os objetos especificando as classes
concretas
na
funo
montaLabirinto();
Usaremos Factory Methods para
deixar que subclasses escolham que
objetos criar
2

Exemplo de cdigo: criao de


Usaremos labirintos
o seguinte projeto
Produto: Sala, Parede, Porta
ProdutoConcreto: Sala, SalaEncantada,
SalaPerigosa, Parede, ParedeComBomba, Porta,
PortaComChave..
Criador: Jogo
Seu mtodo montaLabirinto() cria o labirinto
chamando Factory Methods
Ele tambm um CriadorConcreto pois oferece
uma implementao default para os Factory
Methods (para criar um labirinto simples)
CriadorConcreto: Jogo, JogoEncantado, JogoPerigoso
que sero subclasses de jogo
Iniciamos com o criador Jogo que contm os Factory
Methods
2

Exemplo de cdigo: criao de


labirintos

Exemplo de cdigo: criao de


labirintos

Exemplo de cdigo: criao de


labirintos
Observe como no h acoplamento
(conhecimento) entre montaLabirinto e
outras classes
Para criar um jogo perigoso, criamos
uma subclasse de Jogo e redefinimos
alguns Factory Methods

Exemplo de cdigo: criao de


labirintos

Exemplo de cdigo: criao de


labirintos

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

Exemplo de cdigo: criao de


labirintos

Pergunta
final
para
discusso
De que forma a Factory
Method ajuda a produzir
cdigo fracamente acoplado?

Abstract Factory

Prover uma interface para criar uma


famlia de objetos relacionados ou
dependentes sem especificar suas
classes concretas

Semelhante ao padro Factory Method


Em vez do cliente chamar um mtodo de
criao (Factory Method), ele possui um
objeto (Abstract Factory) e usa este objeto
para chamar os mtodos de criao .
Factory Method quer que voc seja
diferente (via herana) para criar objetos
diferentes, o Abstract Factory quer que
voc tenha algo diferente
3

Se ele possuir uma referncia a uma


Abstract Factory diferente, toda a
criao ser diferente

Exemplo: Look-and-feels
(GUIs)

Para look-and-feel diferentes (Motif, Windows,


Mac, etc.) temos formas diferentes de
manipular janelas, scroll bars, menus, etc.
Para que suporte qualquer look-and-feel,
precisamos ter uma forma simples de criar
objetos (relacionados) de uma mesma famlia.
Os objetos so dependentes porque no
posso criar uma janela estilo Windows e um
menu estilo Motif

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)

Clientes chamam a Abstract Factory para criar


objetos
Uma Factory concreta cria os objetos concretos
apropriados.

Exemplo: Look-and-feels
(GUIs)

Abstract Factory

Quando um sistema deve ser independente de como


seus produtos so criados, compostos e
representados
Quando um sistema deve ser configurado com uma
entre vrias famlias de produtos
Quando uma famlia de produtos relacionados foi
projetada para uso conjunto e voc deve implementar
essa restrio
Quando voc quer fornecer uma biblioteca de classes
e quer revelar sua interface e no sua implementao
No permita portanto que objetos sejam
diretamente criados com new
10

Abstract Factory

11

O padro isola classes concretas


Facilita o cmbio de famlias de
produtos
Promove a consistncia entre
produtos
Do lado negativo: dar suporte a novos
tipos de produtos difcil

!"#

Todos os Factory Methods do padro


anterior saem da classe Jogo e
entram na factory abstrata
FactoryDeLabirinto
Tambm possuem um default, o que
significa que FactoryDeLabirinto
tambm uma factory concreta.

!"#

14

!"#

15

!"#

16

!"#

17

!"#

18

!"#

19

20

Você também pode gostar