原型模式
創建重複的對象,這種設計模式屬於創建型模式,這種模式實現了一個原型接口,用於創建當前對象的克隆
克隆分爲:淺克隆和深克隆
- 淺克隆
被複制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺複製僅僅複製所拷貝的對象,而不復制它所引用的對象。
- 深克隆
被複制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被複制過的新對象,而不再是原有的那些被引用的對象。換言之,深複製把要複製的對象所引用的對象都複製了一遍。
克隆方法
淺克隆:
1.實現 cloneable接口
2.重寫一個方法
深克隆:
在淺克隆的基礎上改造克隆方法
實現:Video的淺克隆
Video.java
package com.li.phototype.demo01;
import java.util.Date;
/*
1.實現 Cloneable接口
2.重新一個方法
*/
//視頻
public 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;
}
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;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
}
bililili.java
package com.li.phototype.demo01;
import java.util.Date;
/*
客戶端:克隆
*/
public class Bililili {
public static void main(String[] args) throws CloneNotSupportedException {
//原型對象 v1
Date date = new Date();
Video v1 = new Video("Java",date);
Video v2 = (Video)v1.clone();//克隆出來的對象一樣
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
// System.out.println("v1=>hash:"+v1.hashCode());
// System.out.println("v2=>hash:"+v2.hashCode());
System.out.println("------------------");
date.setTime(2213323);
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v1);
}
}
控制檯
Video的深克隆
Video.java
```java
package com.li.phototype.demo02;
import java.util.Date;
/*
改造克隆方法
*/
//視頻
public 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 obj;
}
public Video(){
}
public Video(String name, Date createTime) {
this.name = name;
this.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;
}
@Override
public String toString() {
return "Video{" +
"name='" + name + '\'' +
", createTime=" + createTime +
'}';
}
}
bililili.java
package com.li.phototype.demo02;
import java.util.Date;
/*
客戶端:克隆
*/
public class Bililili {
public static void main(String[] args) throws CloneNotSupportedException {
//原型對象 v1
Date date = new Date();
Video v1 = new Video("Java",date);
Video v2 = (Video)v1.clone();//克隆出來的對象一樣
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v2);
// System.out.println("v1=>hash:"+v1.hashCode());
// System.out.println("v2=>hash:"+v2.hashCode());
System.out.println("------------------");
date.setTime(2213323);
System.out.println("v1=>"+v1);
System.out.println("v2=>"+v1);
}
}
控制檯