原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂而且耗费资源。这个时候使用原型模式的克隆方式,能够节省不少时间。比如Java 类中提供的Object clone()就是原型模式的应用。
一、原型模式介绍#
原型设计模式(Prototype Design Pattern)指用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在Java语言中就存在克隆的方式,比如浅拷贝和深拷贝。
对于一般的对象创建,本身不会花费太多的资源,但是对于负责的对象,比如对象的数据需要经过复杂的计算才能得到(比如排序、计算哈希值),抑或是需要从 RPC、网络、数据库、文件系统等非常慢速的IO中读取,这个时候就可以利用原型模式从其他对象直接拷贝,从而减少资源的消耗。
二、原型模式的实现#
在Java中原型模式的实现方式就是深拷贝和浅拷贝,下面来谈谈深拷贝和浅拷贝的区别
2.1 深拷贝和浅拷贝#
2.1.1 浅拷贝#
浅拷贝(Shadow Clone)是把原型对象中的成员变量为值类型的属性都复制给克隆对象,将为引用类的引用地址复制给克隆对象:
实现代码如下:
//实现Cloneable接口
public class ShadowCopy implements Cloneable{
private String name;
private int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public ShadowCopy(String name, int id) {
this.name = name;
this.id = id;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//调用测试
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
ShadowCopy shadowCopy = new ShadowCopy("ethan", 01);
ShadowCopy copy = (ShadowCopy) shadowCopy.clone();
System.out.println("name:" + copy.getName() + " " + "id:" + copy.getId());
System.out.println(copy == shadowCopy);
}
}
最后的测试结果copy == shadowCopy显示为false,说明为浅拷贝。我们再看看深拷贝:
2.1.2 深拷贝#
深拷贝(Deep Clone)是将原型对象中的所有对象,无论值类型还是引用类型,都复制一份给拷贝对象:
那么深拷贝该如何实现?而且前面我们发现,在拷贝时为何需要重写 Object的 clone方法?先来看看其源码,发现clone方法是一个本地方法:
/**
* Creates and returns a copy of this object. The precise meaning
* of "copy" may depend on the class of the object. The general
* intent is that, for any object {@code x}, the expression:
* <blockquote>
* <pre>
* x.clone() != x</pre></blockquote>
* will be true, and that the expression:
* <blockquote>
* <pre>
* x.clone().getClass() == x.getClass()</pre></blockquote>
* will be {@code true}, but these are not absolu