C A M P U S S O C A R LO S
1 Semestre
2016
Padro Observer
Define a dependncia 1:N entre objetos para que quando um objeto mude de
estado, todos os seus dependentes sejam avisados e atualizado automaticamente.
Padro Facade
Interface simples para acesso a um subsistema.
Padro Decorator
Adiciona responsabilidades a um objeto dinamicamente.
Padro Singleton
Garante que uma classe tenha apenas uma instncia, oferecendo um ponto de
acesso global a ela.
Padres de Estrutura
Padres de Estrutura
Abstract Factory
Adapter
Command
Builder
Bridge
Interpreter
Factory Method
Composite
Iterator
Prototype
Decorator
Mediator
Singleton
Facade
Memento
Flyweight
Observer
Proxy
State
Strategy
Template Method
Visitor
Chain of Resposibility
O USO DO NEW
Cada vez que invocamos o new, deixamos de programar
para a interface e passamos a programar para o cdigo
Pato pato = new PatoCabecaVermelha();
PatoCabecaVermelha
O USO DO NEW
Quando temos uma srie de classes concretas relacionadas,
no incomum que vejamos um cdigo como esse:
Pato pato;
if (picnic) {
pato = new PatoReal();
} else if (casa) {
pato = new PatoDecoracao();
} else if (banheira) {
pato = new PatoBorracha();
}
PROBLEMAS?
Pato pato;
if (picnic) {
pato = new PatoReal();
} else if (casa) {
pato = new PatoDecoracao();
} else if (banheira) {
pato = new PatoBorracha();
}
PRINCPIOS DE DESIGN
Violamos alguns princpios no nosso cdigo anterior:
Princpio do aberto fechado.
Uma classe deve estar aberta para extenso, mas fechada para
modificao.
Princpio do encapsulamento
Deve-se sempre encapsular o que varia.
10
return pizza;
}
}
11
}
}
12
if (tipo.equals("mussarela")) {
pizza = new PizzaMussarela();
} else if (tipo.equals("calabresa")) {
pizza = new PizzaCalabresa();
} else if (tipo.equals("frango")) {
pizza = new PizzaFrango();
}
pizza.preparar();
pizza.assar();
pizza.cortar();
pizza.empacotar();
return pizza;
}
}
13
Criao
pizza.preparar();
pizza.assar();
pizza.cortar();
pizza.empacotar();
return pizza;
}
}
14
pizza.preparar();
pizza.assar();
pizza.cortar();
pizza.empacotar();
return pizza;
Preparao
15
Criao
pizza.preparar();
pizza.assar();
pizza.cortar();
pizza.empacotar();
return pizza;
Preparao
}
}
16
17
ENCAPSULANDO A CRIAO
Levar a criao para um objeto preocupado apenas com isso:
public class Pizzaria {
public Pizza realizaPedido (String tipo) {
Pizza pizza;
if (tipo.equals("mussarela")) {
pizza = new PizzaMussarela();
} else if (tipo.equals("calabresa"))
{
pizza = new PizzaCalabresa();
} else if (tipo.equals("frango)) {
pizza = new PizzaFrango();
}
FabricaSimplesDePizza
18
ENCAPSULANDO A CRIAO
Verificamos o que varia: a criao. Logo, vamos coloc-la
em uma classe separada:
public class FabricaSimplesDePizza {
19
PERGUNTA CAPCIOSA
Qual a vantagem disso? Parece que estamos empurrando o
problema para outro objeto.
Lembre-se que a nossa FabricaSimplesDePizza pode ter muitos clientes,
e no apenas a Pizzaria. Pode-se ter, por exemplo, uma
PizzariaDelivery.
Ao encapsular a criao em uma classes, temos apenas um lugar para
fazer a modificao quando algo alterado.
20
SIMPLE FACTORY
Pizzaria
FabricaSimplesDePizza
criaPizza() : Pizza
fabrica: FabricaSimplesDePizza
realizaPedido() : Pizza
Cliente da fbrica
de pizzas
PizzaMussarela
getNome()
preparar()
assar()
cortar()
empacotar()
PizzaCalabresa
PizzaFrango
21
EXERCCIO I
Reimplemente a classe Pizzaria, utilizando a classe
FabricaSimplesDePizza para a criao das pizzas
<<abstract>>
Pizza
Pizzaria
fabrica: FabricaSimplesDePizza
realizaPedido(String tipo):
Pizza
FabricaSimplesDePizza
criaPizza(String tipo): Pizza
getNome()
preparar()
assar()
cortar()
empacotar()
PizzaCalabresa
PizzaFrango
22
FACTORY METHOD
Para entender a importncia do Factory Method, vamos
imaginar que nossa loja est se expandindo...
Novas lojas pelo mundo: Roma, Londres...
23
FACTORY METHOD
O padro de projeto Factory Method permite que faamos
isso:
Colocando cdigo abstrato em uma superclasse.
Colocando o cdigo para criao de objetos em uma subclasse.
Dessa forma...
Pizzaria se torna uma classe abstrata com um mtodo abstrato
criarPizza()
Criamos subclasses que sobrescrevem o mtodo criarPizza() para cada
regio.
24
FACTORY METHOD
O que varia entre as pizzarias de diferentes cidades o
estilo das pizzas:
Cada subclasse substitui o
mtodo criaPizza() e utiliza
mtodo realizaPedido()
definido em Pizzaria
<<abstract>>
Pizzaria
criaPizza(): Pizza
realizaPedido(): Pizza
PizzariaRoma
criaPizza(): Pizza
PizzariaLondres
criaPizza(): Pizza
25
FACTORY METHOD
Classe abstrata Pizzaria:
public abstract class Pizzaria {
public abstract Pizza criaPizza(String tipo);
public Pizza realizaPedido(String tipo) {
Pizza pizza = criaPizza(tipo);
pizza.preparar();
pizza.assar();
pizza.cortar();
pizza.empacotar();
return pizza;
}
}
26
FACTORY METHOD
Classe concreta de uma Pizzaria especfica:
public class PizzariaRoma extends Pizzaria {
public Pizza criaPizza(String tipo) {
if (tipo.equals("mussarela")) {
return new PizzaMussarelaEstiloRoma();
} else if (tipo.equals("calabresa")) {
return new PizzaCalabresaEstiloRoma ();
} else if (tipo.equals("frango")) {
return new PizzaFrangoEstiloRoma ();
}
}
}
27
FACTORY METHOD
Classes de Criao:
<<abstract>>
Pizzaria
criaPizza(): Pizza
realizaPedido(): Pizza
PizzariaRoma
PizzariaLondres
criaPizza(): Pizza
criaPizza(): Pizza
28
FACTORY METHOD
Classes de Produtos:
As fbricas fazem produtos.
No nosso caso, nosso
produto a Pizza
Conjunto de produtos concretos
(pizzas) produzidas em nossas
pizzarias
PizzaMussarelaEstiloRoma
PizzaCalabresaEstiloRoma
<<abstract>>
Pizza
getNome()
preparar()
assar()
cortar()
empacotar()
PizzaMussarelaEstiloLondres
PizzaCalabresaEstiloLondres
29
FACTORY METHOD
Factory Method para nosso problema:
<<abstract>>
Pizzaria
criaPizza(): Pizza
realizaPedido(): Pizza
PizzariaRoma
PizzariaLondres
criaPizza(): Pizza
criaPizza(): Pizza
PizzaMussarelaEstiloRoma
PizzaCalabresaEstiloRoma
<<abstract>>
Pizza
getNome()
preparar()
assar()
cortar()
empacotar()
PizzaMussarelaEstiloLondres
PizzaCalabresaEstiloLondres
30
ESTRUTURA GERAL
O padro Mtodo Factory define uma interface para criar
um objeto, mas deixa as subclasses decidirem qual classe
instanciar.
Creator
factoryMethod() : Product
anOperation()
use
ConcreteCreator
factoryMethod() : ConcreteProduct
Product
ConcreteProduct
create
31
CONSEQUNCIAS
Alm de encapsular os aspectos que variam, permite
tambm criar objetos sem precisar especificar todos os
detalhes necessrios para a criao do mesmo.
Transfere a responsabilidade (e a complexidade) de criao
de objetos de uma classe para outra classe.
32
EXERCCIO II
Implemente a soluo completa da nossa pizzaria, utilizando o
Factory Method, conforme diagrama abaixo.
<<abstract>>
Pizzaria
criaPizza(): Pizza
realizaPedido(): Pizza
PizzariaRoma
PizzariaLondres
criaPizza(): Pizza
criaPizza(): Pizza
<<abstract>>
Pizza
getNome()
preparar()
assar()
cortar()
empacotar()
PizzaMussarelaEstiloLondres
PizzaMussarelaEstiloRoma
PizzaCalabresaEstiloLondres
PizzaCalabresaEstiloRoma
40
PARA REFLETIR...
Para quais objetos do cotidiano da programao seria
interessante utilizar o padro Factory Method?
41
REFERNCIAS
Use a Cabea Padres de Projeto
42
43