作用:当我们需要在不指定类名的情况下生成实例时,可以使用Prototype模式来通过复制生成实例
UML类图:
Product接口:
public interface Product extends Cloneable { public abstract void use(String s); public abstract Product createClone(); }
Manager类:生成对应的克隆对象
public class Manager { private HashMap showcase = new HashMap();//构建哈希表 //构建哈希映射,将每种信号与类对象进行挂钩 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(); } }
MessageBox类:克隆对象生成的主体实现
public class MessageBox implements Product { private char decochar; public MessageBox(char decochar) { this.decochar = decochar; } public void use(String s) { System.out.println("MessageBox Use"); } //克隆对象并返回 public Product createClone() { Product p = (Product)clone(); return p; } }
UnderlinePen类:克隆对象生成的主体实现
public class UnderlinePen implements Product { private char ulchar; public UnderlinePen(char ulchar) { this.ulchar = ulchar; } public void use(String s) { System.out.println("UnderlinePen Use"); } //克隆对象并返回 public Product createClone() { Product p = (Product)clone(); return p; } }
main函数:
public static void Main(String[] argvs) { Manager manager = new Manager(); UnderlinePen upen = new UnderlinePen('~'); MessageBox mbox = new MessageBox('*'); manager.register("strong",upen); manager.register("warning",mbox); Product p1 = manager.create("strong"); p1.use("Hello"); Product p1 = manager.create("warning"); p1.use("Hello"); }
模式细谈:Product接口继承Clone,使其可以仅通过类的对象进行创建新的对象(拷贝构造),且使继承Product的接口均可以通过这种方式来生成复制实例,Manager类作用是调用继承了Product的类可以通过Manager类的对象进行生成对象。
任何对象均可以通过继承Prouduct接口,然后再通过Manager来复制创建实例,Product存在仅仅是为了多态,Product对象可以指向任何继承其接口的类