?一、原型模式介绍
原型模式:原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
所谓原型模式,就是java中的克隆技术,以某个对象为原型。复制出新的对象。显然新的对象具备原型对象的特点。效率高(避免了重新执行构造过程步骤)
克隆类似于new,但和new不同。new创建新的对象属性采用的是默认值。克隆出来的对象的属性值完全和原型对象相同。并且克隆出的新对象不会影响原型对象,克隆后。还可以再修改克隆对象的值。
要实现原型模式,必须实现Cloneable接口,而这个接口里面是空的。
Cloneable接口是一个空接口,使用Cloneable接口都不用导入包。而clone方法是属于Object对象的。如果要克隆某个对象的话必须实现Cloneable接口
1 2 3 4 5 6 7 |
|
重写Object对象的clone方法,clone方法为本地方法。效率比较高
1 |
|
如果我们要克隆某个对象有浅克隆和深克隆
浅克隆:copy该对象,然后保留该对象原有的引用。也就是说不克隆该对象的属性。
深克隆:copy该对象,并且把该对象的所有属性也克隆出一份新的。
二、代码实现
1、浅克隆代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
最后的结果为:克隆的对象仍然保留了原有对象的引用,值随着改变而改变
1 2 3 4 5 6 7 8 |
|
2、深克隆代码实现:克隆对象的同时,把该对象的属性也连带着克隆出新的。
深克隆只需要在clone方法中将该对象的属性也克隆即可
1 2 3 4 5 6 7 8 9 10 11 12 |
|
测试代码不变,结果则会变了。克隆了之后把原来的日期改变后,克隆的对象2的属性则不会被影响。
1 2 3 4 5 6 7 8 |
|
3、通过序列化和反序列化来实现深克隆对象:序列化需要原型对象实现Serializable接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
通过序列化和反序列化的结果,最终结果还是和深克隆一样。
1 2 3 4 5 6 7 8 9 10 11 |
|
三、测试克隆对象的效率
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
最后结果为:
new 对象耗时:10063
clone 对象耗时:10
四、使用场景
原型模式适用场景:如果某个对象new的过程中很耗时,则可以考虑使用原型模式。
Spring框架中bean对象的创建就两种模式:单例模式或者原型模式