标签: 设计模式初涉
简单点说就是克隆对象!适用场景如下:
UML类图如下:
==,如果是对比的基本数据类型(int,long等),比较存储的值是否相等,
如果对比的是引用型的变量,比较的是所指向的对象地址是否相等
equals,不能用于比较基本数据类型,如果没对equals()方法进行
重写,比较的是指向的对象地址,如果想要比较对象内容,需要自行重写
方法,做相应的判断!!!!String调equals是可以判断内容是否一样,是
因为对equals()方法进行了重写,具体自己参见源码!
Prototype原型类(想被克隆的类)实现Cloneable接口,重写clone()方法。
调用:
ConcretePrototype cp1 = new ConcretePrototype();
ConcretePrototype cp2 = (ConcretePrototype)cp1.clone();
通过一个示例代码来学习用法,以及验证一些疑问
1.供引用的类:Money.java
2.实现Cloneable接口的类:Assets.java,核心就是重写clone方法而已
3.调用类:Wealth.java
运行结果:
结果分析得出结论:
上面这种只新建基本类型数据,不新建引用类型数据,称为浅拷贝,
如果连引用类型数据也新建的话,则称为深拷贝。
深拷贝的其中一种实现套路是,引用类型也实现Cloneable接口,然后实现clone方法
比如让Money类也实现Cloneable接口,重写clone方法:
然后Assets类,clone方法那里调这个方法,为money对象赋值:
再运行一遍,运行结果:
好的,结果创建了新的对象,没毛病,另外这种方法实现深拷贝
如果属性的类型也是对象,那么需要一直递归的克隆下去!!
要想深度克隆成功,必须要整个克隆所涉及的对象都要正确实
现克隆方法,如果其中有一个没有正确实现克隆,那么就会导致克隆失败。
这就是深拷贝的其中一种实现套路,还有另一种套路是 序列化,
属性的类型是引用类型的话,需要实现Serializable接口,
然后自己写个方法来在里面完成对象转二进制流与二进制流转
对象的方法,然后返回克隆后的对象!
输出结果和上面一致。
优点:
缺点:
本节代码:
https://github.com/coder-pig/DesignPatternsExample/tree/master/3.Prototype%20Pattern
快速过一过设计模式 —— 4.原型模式(Prototype Pattern)
原文:http://blog.csdn.net/coder_pig/article/details/54583023