spring bean就用了:原型模式
如果某个对象的创建过程太复杂了,如果下次还要要这个对象,就不用new了,用我们的原型模式(浅拷贝或者深拷贝)
原型就是Video类
客户端Bilili为要克隆Video的类
原型类:
1.要实现一个接口Cloneable
2.要重写一个方法clone()
1.浅拷贝
就是复制出来的对象指向原来对象那里
package com.yuan;
import java.util.Date;
/**
* @author QLBF 原型模式
* @version 1.0
* @date 2021/5/25 21:08
*/
/*1.原型要实现一个接口Cloneable
2.要重写一个方法clone()*/
class Video implements 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;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
//客户端Bilili:克隆
public class Bilili {
public static void main(String[] args) throws CloneNotSupportedException {
//原型对象V1
Date date=new Date();
Video v1=new Video("狂神说java",date);
//v2克隆v1
Video v2 = (Video) v1.clone();
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
date.setTime(27128129);
System.out.println("======================");
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
}
}
浅拷贝:把v1的值改了,v2会跟着变
2.深拷贝(深克隆)
其实实现深克隆~还可以用序列化, 反序列化,在这里我们只演示改clone
深拷贝只要在原型类的clone改一下就好,Bilil不用变:
package com.yuan;
import java.util.Date;
/**
* @author QLBF 原型模式
* @version 1.0
* @date 2021/5/25 21:08
*/
/*1.原型要实现一个接口Cloneable
2.要重写一个方法clone()*/
class Video implements Cloneable{
private String name;
private Date createTime;
//这演示深拷贝
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
//实现深克隆
Video v = (Video) obj;
//将这个对象的属性也进行克隆~,在这里我们只演示时间的深克隆,名字这属性没设
v.createTime= (Date) this.createTime.clone();
return v;
}
public Video() {
}
public Video(String name, Date createTime) {
this.name = name;
this.createTime = createTime;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
//客户端Bilili:克隆
public class Bilili {
public static void main(String[] args) throws CloneNotSupportedException {
//原型对象V1
Date date=new Date();
Video v1=new Video("狂神说java",date);
//v2克隆v1
Video v2 = (Video) v1.clone();
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
date.setTime(27128129);
System.out.println("======================");
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
}
}
现在改v1,v2不会跟着变了,因为深克隆的对象指向另一块空间的