需求:现有一只猫,姓名为;tom,年龄为10,颜色为:黑色。编写程序创建和tom猫,属性完全相同的5只猫。
传统的做法:
优缺点:
1)比较好理解,简单易操作。
2)在创建新的对象时,总是需要重新获取原始对象的属性,如果创建的对象比较复杂时,效率较低。
3)总是需要重新初始化对象,而不是动态的获取对象运行的状态,不够灵活。
改进的思路:
java中的Object类是所有类的根类,Object类提供了一个clone()方法,该方法可以将一个java对象复制一份。但是需要实现clone的java类必须要实现一个接口Cloneable,该接口表示该类能够复制且有复制的能力。
原型模式的介绍:
原型模式就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节,就是java中的克隆技术,以某个对象为原型。复制出新的对象。显然新的对象具备原型对象的特点。克隆类似于new,但和new不同。new创建新的对象属性采用的是默认值。克隆出来的对象的属性值完全和原型对象相同。并且克隆出的新对象不会影响原型对象,克隆后。还可以再修改克隆对象的值。要实现原型模式,必须实现Cloneable接口。
示例代码如下:
使用原型模式,让程序有了更高的效率和扩展性。
如果Cat又多了一个属性,例如address,使用原型模式进行克隆,则它的优势就显而易见了。
在Spring中,用户也可以采用原型模式来创建新的Bean实例,从而实现每次获取的是通过克隆生成的新实例,对其进行修改时对原有实例对象不造成任何影响。在每次使用对象之前,都会创建一个新的对象,并且会将依赖关系完整的赋值给这个新创建的对象。这样有利于节省系统资源,还可以更好的对原型管理器对象进行控制。
代码如下:
在使用原型模式克隆对象时,根据其成员对象是否也克隆,原型模式可以分为两种形式: 深拷贝和浅拷贝
当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值。这个方式称为深拷贝。也就是说浅拷贝只复制一个对象,传递引用,不能复制实例。而深拷贝对对象内部的引用均复制,它是创建一个新的实例,并且复制实例。对于浅拷贝当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例。但是当对象的成员变量是引用数据类型时,就不能实现对象的复制了。
浅拷贝代码如下:
浅拷贝:创建一个新对象,然后将当前对象的基本数据类型的成员变量复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一个对象。
深拷贝:创建一个新对象,然后将当前对象的所有属性复制到该新对象,无论该属性是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。
深拷贝有两种实现方式:1)重写clone方法实现深拷贝。2)通过对象序列化实现深拷贝。
相关代码下次更新吧。最近加班太累。。。