原型模式
原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。
1.实现Cloneable接口
2.clone()方法
1.浅克隆
//Video
public class video implements Cloneable{
//实现Cloneable接口
private String name;
private Date createTime;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
public video() {
}
public video(String name, Date createTime) {
this.name = name;
this.createTime = createTime;
}
}
测试类
public static void main(String[] args) throws CloneNotSupportedException {
//原型对象
Date date = new Date();
video v1 = new video("video", date);
video v2 = (video) v1.clone(); //克xz隆出来和v1一模一样的//
System.out.println("v1-->"+v1);
System.out.println("v1hashcode-->"+v1.hashCode());
//v1克隆v2 2个对象
System.out.println("v2-->"+v2);
System.out.println("v2hashcod-->"+v2.hashCode());
System.out.println("=======================================");
date.setTime(290000);//改变 date的值
System.out.println("v1"+v1);
System.out.println("v2"+v2);
结果是
修改date值后 v2也跟着修改
原因是浅克隆
两个对象的date指向的是同一个地址 所以v1改变地址 v2也跟着改变
2.深克隆
public class video implements Cloneable{
private String name;
private Date createTime;
@Override//深克隆
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
//实现深克隆 序列化 反序列化
video video = (video) obj;
video.createTime= (Date) this.createTime.clone();
//将这个对象的属性也进行克隆
return obj;
}
public video() {
}
public video(String name, Date createTime) {
this.name = name;
this.createTime = createTime;
}
测试类
public static void main(String[] args) throws CloneNotSupportedException {
//原型对象
Date date = new Date();
video v1 = new video("video", date);
System.out.println("vi=>"+v1);
System.out.println("vi=>hashcode"+v1.hashCode());
video v2 = (video) v1.clone(); //克隆出来和v1一模一样的
//v1克隆v2 2个对象
System.out.println("v2=>"+v2);
System.out.println("v2=>hashcod"+v2.hashCode());
System.out.println("============改变date的值后不改变=============");
date.setTime(290000);
System.out.println("v1"+v1);
System.out.println("v2"+v2);
}