Padrão Prototype
Projeto de Sistemas de Software
Luana Lachtermacher
Propósito
- Criação de objetos específicos através de uma instância de
um protótipo.
- É um padrão de criação.
© LES/PUC-Rio
Motivação
• Ao invés de criar diversos classes que diferem pouco, é
possível fazer copias de uma instância(protótipo).
• Cada copia é utilizada de acordo com suas propriedades
específicas.
© LES/PUC-Rio
Aplicabilidade
• Sistema independente de como os produtos são criados,
compostos e representados.
• Quando as classes são instanciadas em tempo de execução
ou
• Para evitar a criação de classe hierárquica de fabricas que
tem paralelo a hierarquia de produtos
ou
• Quando instâncias da classe tem uma das poucas
combinações de estados.
© LES/PUC-Rio
Estrutura
© LES/PUC-Rio
Participantes
• Prototype
– Define a interface para se clonar
• ConcretePrototype
– Implementa uma operação para se clonar.
• Client
– Cria um novo objeto pedindo ao protótipo para se clonar.
© LES/PUC-Rio
Colaborações
• O client pede ao protótipo para se clonar.
© LES/PUC-Rio
Vantagens / Desvantagens
•
•
Vantagem :
–
Maior abstração
–
Adição e remoção de produtos em tempo real. That's a bit more
flexible than other creational patterns, because a client can install and
remove prototypes at run-time.
–
Criação de novos objetos variando valores e estruturas.
–
Reduced subclassing. Factory Method (107) often produces a hierarchy
of Creator classes that parallels the product class hierarchy. The
Prototype pattern lets you clone a prototype instead of asking a factory
method to make a new object.
–
Configurando uma aplicação com classes dinamicamente.
Desvantagem:
–
Cada subclasses necessita implementar a operação de Clonar m que
pode ser complicada se incluir objetos que não suportam copia ou que
possuem referencias circulares.
© LES/PUC-Rio
Exemplo
Referência : http://www.guj.com.br/content/articles/patterns/prototype_pattern_guj.pdf
© LES/PUC-Rio
Exemplo
public class Application {
public static void main(String[] args) {
ProductCache.loadCache();
Book clonedBook =
(Book) ProductCache.getProduct("B1");
public abstract class Product implements Cloneable{
DVD clonedDVD =
(DVD) ProductCache.getProduct("D1");
}
public Object clone() {
Object clone = null;
try { clone = super.clone(); }
catch {}
return clone;
}
}
public class ProductCache {
private static Hashtable productMap = new Hashtable();
public static Product getProduct(String productCode{
Product cachedProduct =
(Product) productMap.get(productCode);
return (Product) cachedProduct.clone(); }
public class Book extends Product {
private int numberOfPages;
public int getNumberOfPages() {
return numberOfPages; }
public void setNumberOfPages(int i){
numberOfPages = i; }
}
public static void loadCache()
{ // for each product run expensive
query and instantiate product //
productMap.put(productKey, product);
products Book b1 = new Book();
productMap.put(b1.getSKU(), b1);
DVD d1 = new DVD();
productMap.put(d1.getSKU(), d1); }
public class DVD extends Product {
private int duration;
public int getDuration() { return duration; }
public void setDuration(int i) { duration = i; }
}
}
© LES/PUC-Rio
Download

Slides - (LES) da PUC-Rio