原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂而且耗费资源。这个时候使用原型模式的克隆方式,能够节省不少时间。比如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 absolute requireme