#format java /** * PrototypePattern Example */ import java.util.*; interface Product extends Cloneable { public abstract void use(String s); public abstract Product createClone(); } class Manager { private Hashtable showcase = new Hashtable(); public void register(String name, Product proto) { showcase.put(name, proto); } public Product create(String protoname) { Product p = (Product)showcase.get(protoname); return p.createClone(); } } class MessageBox implements Product { private char decochar; public MessageBox(char decochar) { this.decochar = decochar; } public void use(String s) { int length = s.getBytes().length; for(int i=0; i < length+4; i++) { System.out.print(decochar); } System.out.println(""); System.out.println(decochar+" "+s+" "+decochar); for(int i=0; i < length+4; i++) { System.out.print(decochar); } System.out.println(""); } public Product createClone() { Product p = null; try { p = (Product)clone(); } catch(CloneNotSupportedException e) { e.printStackTrace(); } return p; } } class UnderlinePen implements Product { private char ulchar; public UnderlinePen(char ulchar) { this.ulchar = ulchar; } public void use(String s) { int length = s.getBytes().length; System.out.println("\""+s+"\""); System.out.print(" "); for(int i=0; i < length; i++) { System.out.print(ulchar); } System.out.println(""); } public Product createClone() { Product p = null; try { p = (Product)clone(); } catch(CloneNotSupportedException e) { e.printStackTrace(); } return p; } } public class PrototypeDisplay { public static void main(String[] args) { Manager manager = new Manager(); UnderlinePen upen = new UnderlinePen('~'); MessageBox mbox = new MessageBox('*'); MessageBox sbox = new MessageBox('/'); manager.register("strong message", upen); manager.register("warning box", mbox); manager.register("slash box", sbox); Product p1 = manager.create("strong message"); p1.use("Hello, world."); Product p2 = manager.create("warning box"); p2.use("Warning"); Product p3 = manager.create("slash box"); p3.use("Slash"); } }