1.原型模式
克隆:给出一个对象,调用对象内部的clone方法,返回一个新对象。
1.1.浅克隆
-
定义:旧对象copy出一个新对象,为新对象分配新地址。
-
变化:新对象值类型的成员变量占用新的内存空间。
-
不变:新对象引用类型的成员变量指向的是同一个内存地址。
-
要求:实现克隆的Java类必须实现一个标识接口Cloneable。
-
模式结构:
-
demo1:
public class PrototypeDemo implements Cloneable
{
……
public Object clone()
{
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("Not support cloneable");
}
return (PrototypeDemo)object;
}
……
}
- demo2:
public class PrototypeDemo implements Cloneable
{
……
public Object clone()
{
Object object = null;
try {
object = super.clone();
(PrototypeDemo)object.set某个引用类型属性(this.引用类型属性.clong())//这时引用类型的成员变量指向的就不是同一个内存地址
} catch (CloneNotSupportedException exception) {
System.err.println("Not support cloneable");
}
return (PrototypeDemo)object;
}
……
}
1.2.深克隆
- 定义:旧对象copy出一个新对象,为新对象分配新地址。
- 变化:新对象值类型的成员变量占用新的内存空间,新对象引用类型的成员* 变量指向的不是同一个内存地址。
- 要求:旧对象以及其引用类型的成员变量所属类实现序列化接口。
易错点:如果对象间存在多重的嵌套引用,要实现深克隆,有两种方法:
1.对象和多重的嵌套引用所属的类都需要实现序列化接口,这样就可以实现深克隆。
2.对象和多重的嵌套引用所属的类都有内部都有一个克隆方法,整体在克隆的时候必须以调用部分的克隆方法为参进行对属性的设置注入;当然,“都有一个克隆方法”是底线,如果能实现序列化接口式的深克隆就不必要了。
例子:a类有b类的引用,b类有c类的引用,a、b都实现序列化接口,a中有序列化接口式的深克隆方法,c没有实现序列化接口,这时对于a类就不能实现深克隆。
解决:1.c实现序列化接口;2.c有浅克隆方法,b以调用c的克隆方法为参进行对属性的设置注入。
- 模式结构:
- demo: