原型模式(Prototype Pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,属于创建型模式。
原型模式的核心在于拷贝原型对象。以系统中已存在的一个对象为原型,直接基于内存二进制流进行拷贝,无需再经历耗时的对象初始化过程(不调用构造函数),性能提升许多。当对象的构建过程比较耗时时,可以利用当前系统中已存在的对象作为原型,对其进行克隆(一般是基于二进制流的复制),躲避初始化过程,使得新对象的创建时间大大减少。
下面我们看一个标准的原型模式的写法。
定义原型接口
// 定义 原型接口类
public interface IPrototype {
Object clone();
}
具体的原型类,并添加克隆方法
public class PrototypeImpl implements IPrototype {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 克隆
public PrototypeImpl clone() {
PrototypeImpl obj = new PrototypeImpl();
obj.setAge(age);
obj.setName(name);
return obj;
}
// 打印信息
public String toString() {
return "obj:{age=" + age +",name=" + name + "}";
}
}
测试类
public class Test {
public static void main(String[] args) {
//创建原型对象
PrototypeImpl prototype = new PrototypeImpl();
prototype.setAge(12);
prototype.setName("18");
System.out.println(prototype);
//克隆,拷贝
PrototypeImpl cloneType = prototype.clone();
System.out.println(cloneType);
}
}
测试结果,通过打印输出,发现两个对象的信息是一致的,实现了对原型对象的创建。
上面的复制过程是我们自己完成的,在实际编码中,我们一般不会浪费这样的体力劳动,JDK已经帮我们实现了一个现成的API,我们只需要实现Cloneable接口即可。来改造一下代码,修改PrototypeImpl类,将克隆方法写成如下方法即可:
/*// 原始克隆
public PrototypeImpl clone() {
PrototypeImpl obj = new PrototypeImpl();
obj.setAge(age);
obj.setName(name);
return obj;
}*/
// 实现Cloneable,JDK自带克隆
public PrototypeImpl clone() {
PrototypeImpl obj = null;
try {
obj = (PrototypeImpl)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}