原型模式定义如下:
Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.
用原型实例指定待创建对象的种类,并通过拷贝该原型对象来创建新的对象。
用再通俗直白的话来说,就是创建对象不是通过new关键字来创建,而是通过对对象的复制来实现,这样的模式就是原型模式。
原型模式的通用类图如下:
原型模式的核心就是clone方法,实现Cloneable接口即可。
原型模式优点:
1.性能优良:原型模式是在内存二进制流的拷贝,比直接new一个对象性能要好很多。
2.避免构造函数的约束:这既可以认为是优点,也可以认为是缺点,直接在内存中拷贝,构造函数是不会执行的。
Object类的clone方法的原理是从内存中(具体的说是堆内存)以二进制的方式进行拷贝,重新分配一个内存块。所以构造函数没有被执行也是很正常了。
浅拷贝和深拷贝
浅拷贝:Object类提供的方法clone只是拷贝对象,其对象内部的数组、引用对象等都不拷贝,还是指向原声对象的内部元素地址,这种拷贝就叫做浅拷贝。也就是说对象内部如果有数组、引用对象等应用类型,那么在clone出来的对象和原对象中的数组等引用类型是同一个对象。并不是新的内存地址。
那么浅拷贝引发的问题就是,对原对象或者clone出来的对象中的引用类型进行修改,都会引起另一方对象中的引用类型对象的改变。
浅拷贝其实是基本数据类型和String(在这里String类型可以认为是基本数据类型)类型都会被拷贝,数组、对象等引用类型的对象直接还是使用的原来对象的堆内存地址
深拷贝:深拷贝当然就是在浅拷贝的基础上,对引用对象也进行拷贝,也就是clone出来的对象和原对象中的引用类型是不同的对象,内存地址都变了的。实现深拷贝,就是要在clone方法中对引用对象重新clone一次。
注意事项:
要使用clone方法,不要用final修饰成员变量。
网友评论