背景:
我需要创建 10个一模一样的参数的 类
浅拷贝
创建好对应的类:注意要实现 cloneable 这个接口 并重写 他的clon 方法
测试 : 发现 改了 参数 他也能进行 对应的反射 并且 地址 是不一样的。
但是 如果增加一个对象参数的 就不一样了。
测试代码:
这就是 浅拷贝 如果是引用类型的 他仅仅只是 把地址复制一下。
深拷贝:
方式一:
就是 你创建的那个 类也实现 cloneable 的 clon方法
测试略 (不推荐 过于繁琐 如果引用的多 每个类都要写)
方式二:
进行序列化:(偷个懒 复制尚硅谷笔记代码)
//深拷贝 - 方式 2 通过对象的序列化实现 (推荐)
public Object deepClone() {
//创建流对象
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
try {
//序列化
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(this); //当前这个对象以对象流的方式输出
//反序列化
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
DeepProtoType copyObj = (DeepProtoType)ois.readObject();
return copyObj;
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return null;
} finally {
//关闭流
try {
bos.close();
oos.close();
bis.close();
ois.close();
} catch (Exception e2) {
// TODO: handle exception
System.out.println(e2.getMessage());
}
}
}
}
优缺点:
- 创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程,同时也能够提高效率
- 不用重新初始化对象,而是动态地获得对象运行时的状态
- 如果原始对象发生变化(增加或者减少属性),其它克隆对象的也会发生相应的变化,无需修改代码
- 在实现深克隆的时候可能需要比较复杂的代码
- 缺点:需要为每一个类配备一个克隆方法,这对全新的类来说不是很难,但对已有的类进行改造时,需要修改
其源代码,违背了 ocp