原型模式

2019-03-26  本文已影响0人  _fan凡

原型模式定义如下:

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修饰成员变量。

上一篇 下一篇

猜你喜欢

热点阅读