一、引言
每天多学一点点 ~
坚持就是最快得成功 ~
二、什么是原型模式
原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。
三、应用场景
- 对象之间相同或相似,即只是个别的几个属性不同的时候。
- 对象的创建过程比较麻烦,但复制比较简单的时候。
四、优缺点
优点
- Java 自带的原型模式性能更优
- 可以使用深克隆的方式保存对象状态,可辅助实现撤销操作
缺点
- 需要为每一个类都配置一个clone方法
- clone方法位于类的内部,违背了开闭原则
- 深克隆时逻辑较为复杂
五、浅克隆
定义:创建一个新对象,新对象的属性和原对象完全相同,对于非基本类型属性,仍指向原有属性所指向的地址 。
代码实现:
/**
* @Author WangYan
* @Date 2022/8/21 22:25
* @Version 1.0
* 视频类
*
* 浅拷贝
* 实现克隆步骤:
* 1.实现一个接口 Cloneable
* 2.重写一个方法 clone()
*/
@AllArgsConstructor
@Data
public class Video implements Cloneable {
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
/**
* @Author WangYan
* @Date 2022/8/21 22:35
* @Version 1.0
* 测试克隆 浅拷贝
*/
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date();
Video v1 = new Video("bibil", date);
// 克隆对象
Video v2 = (Video) v1.clone();
System.out.println("v1 : " + v1);
System.out.println("v2 : " + v2);
System.out.println("===============================");
date.setTime(41421414);
System.out.println("v1 : " + v1);
System.out.println("v2 : " + v2);
}
}
运行结果:
由此可以看出v1和v2对象得属性createTime时间都改变了,证明出v1和v2的对象的date指向得是同一个地址.
六、深克隆
定义:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原来的地址
代码实现:
深克隆: 只需要改变 clone() 方法.
/**
* @Author WangYan
* @Date 2022/8/21 22:25
* @Version 1.0
* 视频类
*
* 深克隆: 只需要改变 clone() 方法
*/
@AllArgsConstructor
@Data
public class Video implements Cloneable {
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
Video video = (Video) super.clone();
// 克隆属性
video.createTime = (Date) this.createTime.clone();
return video;
}
}
结果:
由此看出,只有v1对象得createTime属性改变了,证明出v1和v2的对象的date指向得不是同一个地址
总结:
浅克隆和深克隆对于非基本数据类型属性,指向得地址值不同。浅克隆指向原有的属性地址值,深克隆则是创建一个新的,指向新的属性地址值。