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