Sablonul de proiectare Prototype
Descriere
Sablonul prototype este practic mecanismul de construire a unui obiect prin clonarea unei instante existene. Acest mecanism se utilizeaza atunci cand mecanismul standard de construire a obiectelor prin new este prea costisitor sau nu este permis. Acest sablon utilizeaza metoda Object.clone().
Diagrama UML
Exemplu
public abstract class Product implements Cloneable { private String SKU; private String description; public Object clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return clone; } public String getDescription() { return description; } public String getSKU() { return SKU; } public void setDescription(String string) { description = string; } public void setSKU(String string) { SKU = string; } } /** * Concrete Prototypes to clone * */ class Book extends Product { private int numberOfPages; public int getNumberOfPages() { return numberOfPages; } public void setNumberOfPages(int i) { numberOfPages = i; } } /** * Concrete Prototypes to clone * */ class DVD extends Product { private int duration; public int getDuration() { return duration; } public void setDuration(int i) { duration = i; } } //////////////////////// PrototypeExample.java import java.util.Hashtable; public class PrototypeExample { Hashtable<String, Product> productMap = new Hashtable<String, Product>(); public Product getProduct(String productCode) { Product cachedProduct = (Product) productMap.get(productCode); return (Product) cachedProduct.clone(); } public void loadCache() { //for each product run expensive query and instantiate // product productMap.put(productKey, product); // for exemplification, we add only two products Book b1 = new Book(); b1.setDescription("Oliver Twist"); b1.setSKU("B1"); b1.setNumberOfPages(100); productMap.put(b1.getSKU(), b1); DVD d1 = new DVD(); d1.setDescription("Superman"); d1.setSKU("D1"); d1.setDuration(180); productMap.put(d1.getSKU(), d1); } public static void main(String[] args) { PrototypeExample pe = new PrototypeExample(); pe.loadCache(); Book clonedBook = (Book) pe.getProduct("B1"); System.out.println("SKU = " + clonedBook.getSKU()); System.out.println("SKU = " + clonedBook.getDescription()); System.out.println("SKU = " + clonedBook.getNumberOfPages()); DVD clonedDVD = (DVD) pe.getProduct("D1"); System.out.println("SKU = " + clonedDVD.getSKU()); System.out.println("SKU = " + clonedDVD.getDescription()); System.out.println("SKU = " + clonedDVD.getDuration()); } }
Rezultatul rularii codului:
SKU = B1 SKU = Oliver Twist SKU = 100 SKU = D1 SKU = Superman SKU = 180