原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。
原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:
- 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
- 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。
Prototype
package design.pattern.prototype; public final class Prototype implements Cloneable{ private int version; private SubInfo info; public Prototype(int version, SubInfo info) { this.version = version; this.info = info; } public int getVersion() { return version; } public SubInfo getInfo() { return info; } @Override public Object clone() throws CloneNotSupportedException { Prototype cpo = (Prototype)super.clone(); cpo.info = (SubInfo) info.clone(); return cpo; } @Override public String toString() { return "Prototype: " + this.version + " " + info.getMsg(); } } final class SubInfo implements Cloneable{ private String msg; public SubInfo(String msg) { this.msg = msg; } public String getMsg() { return this.msg; } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }
Client
package design.pattern.prototype; public class Client { public static void main(String[] args) throws CloneNotSupportedException { Prototype pro1 = new Prototype(1, new SubInfo("version 1")); Prototype pro2 = (Prototype) pro1.clone(); System.out.println("(pro1==pro2): " + (pro1==pro2)); System.out.println("(pro1.getInfo()==pro2.getInfo()): " + (pro1.getInfo()==pro2.getInfo())); System.out.println("pro1: " + pro1); System.out.println("pro2: " + pro2); } }