Análise e Projeto Orientados  
por Objetos  
Aula 10 Padrões GoF (Protoype e Façade)  
Edirlei Soares de Lima  
<edirlei@iprj.uerj.br>  
Padrões GoF  
Criação:  
Estruturais:  
Comportamentais:  
Abstract Factory  
Builder  
Factory Method  
Prototype  
Singleton  
Adapter  
Bridge  
Chain of Responsibility  
Command  
Interpreter  
Iterator  
Mediator  
Memento  
Composite  
Decorator  
Façade  
Flyweight  
Proxy  
Observer  
State  
Strategy  
Template Method  
Visitor  
Prototype  
Intenção: permitir a criação de objetos a partir de um  
modelo, ou seja, permitir a especificação de tipos de objetos a  
serem criados usando uma instância-protótipo e criar novos  
objetos pela cópia desse protótipo.  
Prototype  
Prototype Exemplo  
Prototype Implementação  
public abstract class Shape implements Cloneable {  
private String id;  
protected String type;  
abstract void draw();  
public String getType(){  
return type;  
}
public String getId() {  
return id;  
}
public void setId(String id) {  
this.id = id;  
}
public Object clone() {  
Object clone = null;  
try {  
clone = super.clone();  
}
catch (CloneNotSupportedException e){e.printStackTrace();}  
return clone;  
}
}
Prototype Implementação  
public class Rectangle extends Shape {  
public Rectangle(){  
type = "Rectangle";  
}
@Override  
public void draw() {  
System.out.println("Inside Rectangle::draw() method.");  
}
}
public class Square extends Shape {  
public Square(){  
type = "Square";  
}
@Override  
public void draw() {  
System.out.println("Inside Square::draw() method.");  
}
}
Prototype Implementação  
public class Circle extends Shape  
{
public Circle(){  
type = "Circle";  
}
@Override  
public void draw() {  
System.out.println("Inside Circle::draw() method.");  
}
}
Prototype Implementação  
public class ShapeCache {  
private static Hashtable<String, Shape> shapeMap = new  
Hashtable<String, Shape>();  
public static Shape getShape(String shapeId){  
Shape cachedShape = shapeMap.get(shapeId);  
return (Shape) cachedShape.clone();  
}
public static void loadCache() {  
Circle circle = new Circle();  
circle.setId("1");  
shapeMap.put(circle.getId(),circle);  
Square square = new Square();  
square.setId("2");  
shapeMap.put(square.getId(),square);  
Rectangle rectangle = new Rectangle();  
rectangle.setId("3");  
shapeMap.put(rectangle.getId(), rectangle);  
}
}
Prototype Implementação  
public static void main(String[] args)  
{
ShapeCache.loadCache();  
Shape clonedShape = (Shape) ShapeCache.getShape("1");  
System.out.println("Shape : " + clonedShape.getType());  
Shape clonedShape2 = (Shape) ShapeCache.getShape("2");  
System.out.println("Shape : " + clonedShape2.getType());  
Shape clonedShape3 = (Shape) ShapeCache.getShape("3");  
System.out.println("Shape : " + clonedShape3.getType());  
}
Prototype Aplicabilidade  
Quando a instânciação de um novo objeto demanda a  
execução de operações complexas que requerem tempo.  
Quando as instâncias de uma classe puderem ter uma dentre  
poucas combinações diferentes de estados.  
Pode ser mais conveniente definir um número correspondente de  
protótipos e cloná-los, ao invês de instanciar a classe manualmente,  
cada vez com um estado apropriado.  
Façade  
Intenção: disponibilizar uma interface simplificada para as  
funcionalidades de partes do sistema ou de uma biblioteca.  
O Façade pode:  
Tornar uma biblioteca de software mais fácil de entender e usar;  
Tornar o código que utiliza esta biblioteca mais fácil de entender;  
Reduzir as dependências em relação às características internas de uma  
biblioteca, trazendo flexibilidade no desenvolvimento do sistema;  
Envolver uma interface mal desenhada, com uma interface melhor  
definida.  
Façade  
Façade Exemplo  
Façade Implementação  
public interface Shape  
{
void draw();  
}
public class Rectangle implements Shape  
{
@Override  
public void draw()  
{
System.out.println("Rectangle::draw()");  
}
}
Façade Implementação  
public class Square implements Shape  
{
@Override  
public void draw()  
{
System.out.println("Square::draw()");  
}
}
public class Circle implements Shape  
{
@Override  
public void draw()  
{
System.out.println("Circle::draw()");  
}
}
Façade Implementação  
public class ShapeMaker {  
private Shape circle;  
private Shape rectangle;  
private Shape square;  
public ShapeMaker() {  
circle = new Circle();  
rectangle = new Rectangle();  
square = new Square();  
}
public void drawCircle(){  
circle.draw();  
}
public void drawRectangle(){  
rectangle.draw();  
}
public void drawSquare(){  
square.draw();  
}
}
Façade Implementação  
public static void main(String[] args)  
{
ShapeMaker shapeMaker = new ShapeMaker();  
shapeMaker.drawCircle();  
shapeMaker.drawRectangle();  
shapeMaker.drawSquare();  
}