package com.vatana.prototype.framework; /** * 原型模式 继承 Cloneable接口,定义了创建clone的方法, * 要求所有实现了此接口的类都要实现use和creatClone方法 * @author Vatana */ public interface Product extends Cloneable{ void use(String e); Product createClone(); } package com.vatana.prototype.framework; import java.util.HashMap; import java.util.Map; /** * 原型模式,管理中心,管理装载的所有对象, * 在程序初始化时装载对象 * 运行时通过活动已装载类的clone来创建新的对象 * @author Vatana */ public class Manager { private Map<String,Product> showcase = new HashMap<String,Product>(); public void register(String name,Product product){ showcase.put(name, product); } public Product create(String name){ Product product = showcase.get(name); return product.createClone(); } } package com.vatana.prototype; import com.vatana.prototype.framework.Product; /** * 一个等待装载的类。 * 实现了createClone方法获得新的对象, * * @author Vatana */ public class MessageBox implements Product{ private char decochar; public MessageBox(char decochar){ this.decochar = decochar; } @Override public void use(String e) { int length = e.getBytes().length; for(int i=0;i<length+4;i++){ System.out.print(decochar); } System.out.println(); System.out.println(decochar+" "+e+" "+decochar); for(int i=0;i<length+4;i++){ System.out.print(decochar); } System.out.println(); } @Override public Product createClone() { Product p=null; try{ p = (Product)clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return p; } } package com.vatana.prototype; import com.vatana.prototype.framework.Product; /** * 另一个等待装载的类 * @author Vatana */ public class UnderlinePen implements Product{ private char decochar; public UnderlinePen(char decochar){ this.decochar = decochar; } @Override public void use(String e) { int length = e.getBytes().length; System.out.println(decochar+" "+e+" "+decochar); for(int i=0;i<length+4;i++){ System.out.print(decochar); } System.out.println(); } @Override public Product createClone() { Product p=null; try{ p = (Product)clone(); }catch(CloneNotSupportedException e){ e.printStackTrace(); } return p; } } package com.vatana.prototype; import com.vatana.prototype.framework.Manager; import com.vatana.prototype.framework.Product; /** * 原型模式 * 适用情形 * 1、种类太多 需要设计大量的类文件 * 2、不容易利用new来创建,比如需要通过用户操作来生成的实例, * 如果已经创造过实例,应该保存起来等下一次需要的时候直接clone * 3、希望把框架和实例分开 * 不是用类创建实例,而是从一个对象实例创建出另一个 * 类名 是一种束缚,要尽量减少类名的使用,类名多导致实例化也多,同时要修改的内容也多, * 而且很难知道与其他类有没有勾结。 * 程序设计守则:只有class类,不允许修改源代码,也要能够复用。 * * @author Vatana */ public class Prototype { public static void main(String[] a) { //预备阶段,创建对象 Manager manager = new Manager(); UnderlinePen upen = new UnderlinePen('~'); MessageBox mbox1 = new MessageBox('*'); MessageBox mbox2 = new MessageBox('o'); //装载对象 manager.register("upen", upen); manager.register("mbox1", mbox1); manager.register("mbox2", mbox2); //使用时通过获得键值获得对象 Product p1 = manager.create("upen"); p1.use("Hello world"); Product p2 = manager.create("mbox1"); p2.use("Hello world"); Product p3 = manager.create("mbox2"); p3.use("Hello world"); } }