原型模式
1 基本概念
1、克隆的步骤
- 实现一个接口:Cloneable。
- 重写一个方法:clone()。
2 代码
1、案例1:浅克隆
Video
package prototype.demo01; import java.util.Date; public class Video implements Cloneable { private String name; private Date createTime; 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 + '}'; } // 浅克隆 @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } }
Bilibili
package prototype.demo01; import org.junit.Test; import java.util.Date; /** * 客户端 */ public class Bilibili { /** * 浅克隆 */ @Test public void test() throws CloneNotSupportedException { // 原型对象:v1 Date date = new Date(); Video v1 = new Video("my video", date); System.out.println("v1:" + v1); System.out.println("v1.hashCode():" + v1.hashCode()); // 克隆对象:v2 Video v2 = (Video) v1.clone(); System.out.println("v2:" + v2); System.out.println("v2.hashCode():" + v2.hashCode()); System.out.println(v1.getCreateTime() == v2.getCreateTime()); // true } }
2、案例2:深克隆
Video
package prototype.demo02; import java.util.Date; public class Video implements Cloneable { private String name; private Date createTime; 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 + '}'; } // 实现深克隆 @Override protected Object clone() throws CloneNotSupportedException { Object obj = super.clone(); Video v = (Video) obj; // 将这个对象的属性也进行克隆 v.createTime = (Date) this.createTime.clone(); return obj; } }
Bilibili
package prototype.demo02; import org.junit.Test; import java.util.Date; /** * 客户端 */ public class Bilibili { /** * 深克隆 */ @Test public void test() throws CloneNotSupportedException { // 原型对象:v1 Date date = new Date(); Video v1 = new Video("my video", date); System.out.println("v1:" + v1); System.out.println("v1.hashCode():" + v1.hashCode()); // 克隆对象:v2 Video v2 = (Video) v1.clone(); System.out.println("v2:" + v2); System.out.println("v2.hashCode():" + v2.hashCode()); System.out.println(v1.getCreateTime() == v2.getCreateTime()); // false } }