当系统中存在大量相同或相似的对象时,用传统的构造函数来创建,就会比较复杂,并且耗时耗资源。用原型模式生成对象就很高效,就像多重影分身一样。
定义和特点
定义:用一个已经创建好的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
特点:
优点:Java自带的原型模式基于内存二进制流的复制,在性能上比直接new一个对象要优良。
可使用深克隆保存对象的状态,使用原型模式将对象复制一份,并保存其状态,简化创建对象的过程。
缺点:需要每一个类都配置一个clone方法。
clone方法在类的内部,当对已有类进行改造时,需要修改代码,违背了开闭原则。
当实现深度克隆时,需要编写比较复杂的代码,并且当对象之间存在多重嵌套引用时,为了实现深度克隆,每一层对应的类都必须支持深克隆,比较麻烦。
实现
Java中提供了clone方法,因此实现原型模式相对简单。
原型模式的克隆分为浅克隆和深克隆两种。
浅克隆:就是创建一个新对象,新对象的属性和原对象完全相同,对于非基本类型属性,仍指向原来属性指向的对象的内存地址。
深克隆:就是创建一个新对象,属性中引用的其他对象也会被克隆,不在指向原有对象的地址。
Java中Object类提供了浅克隆clone方法,具体原型类只要实现Cloneable接口就可实现对象的浅克隆,如下:
//具体原型类
class Realizetype implements Cloneable {
Realizetype() {
System.out.println("原型创建成功!");
}
public Object clone() throws CloneNotSupportedException {
System.out.println("原型复制成功!");
return (Realizetype) super.clone();
}
}
//原型模式的测试类
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
Realizetype obj1 = new Realizetype();
Realizetype obj2 = (Realizetype) obj1.clone();
System.out.println("obj1==obj2?" + (obj1 == obj2));
}
}
运行结果如下:
原型创建成功! 原型复制成功! obj1==obj2?false