一.定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
二.概述
1.当系统中需要大量创建相同或者相似的对象时,就可以通过“原型设计模式”来实现。原型模式是“创建型设计模式”中的一种。
2.原型模式的核心思想是,通过拷贝指定的“原型实例(被克隆的对象)”,创建跟该对象一样的新对象。简单理解就是“克隆指定对象”。
三.优缺点
1.优点:
(1)java自带的原型模式基于内存二进制流的复制,在性能上比直接 new 一个对象更加优良。
(2)可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份,并将其状态保存起来,简化了创建对象的过程,以便在需要的时候使用(例如恢复到历史某一状态),可辅助实现撤销操作。
2.缺点:
(1)需要为每一个类都配置一个 clone 方法
(2)clone 方法位于类的内部,当对已有类进行改造的时候,需要修改代码,违背了开闭原则。
(3)当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。
四.结构
1.抽象原型类:规定了具体原型对象必须实现的接口。
2.具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
3.访问类:使用具体原型类中的 clone() 方法来复制新的对象。
4.结构图
五.深拷贝和浅拷贝
1.浅拷贝:
(1)当类的成员变量是基本数据类型时,浅拷贝会复制该属性的值赋值给新对象。
(2)当成员变量是引用数据类型时,浅拷贝复制的是引用数据类型的地址值。它跟原对象指向的是一个内存地址,当变量修改,就相当于所有的都改了
2.深拷贝:
(1)当类的成员变量是基本数据类型时,浅拷贝会复制该属性的值赋值给新对象。
(2)当成员变量是引用数据类型时,深拷贝会给是引用数据类型的成员变量申请储存空间,并复制引用数据类型成员变量的对象。所以就不会对拷贝出的对象造成影响。
六:具体实现
1.需要拷贝的原型类必须实现"java.lang.Cloneable"接口,然后重写Object类中的clone方法,从而才可以实现类的拷贝。
2.Cloneable是一个“标记接口”,所谓的标记接口就是该接口中没有任何内容。标记接口的作用就是为了给所有实现了该接口的类赋予一种特殊的标志。
3.只有当一个类实现了Cloneable接口后,该类才会被赋予调用重写自Object类的clone方法得权利。否则会抛出“CloneNotSupportedException”异常。
4.代码
//具体原型类
class Realizetype implements Cloneable{
Realizetype(){
System.out.println("具体原型创建成功!");
}
//重写Object类的clone方法
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));//结果为false
}
}
七.原型模式的应用场景
1.对象之间相同或相似,即只是个别的几个属性不同的时候。
2.创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
3.创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
4.系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。