原型模式, 就是我们提供一个原型, 然后使用这样的思想就是对原型进行复制, 得到一个新的对象, 和原型对象一模一样, 但是是两个不同的对象(hashcode 不同)
一、 浅克隆
user
public class user implements Cloneable {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
private Integer id;
private String name;
private Date date;
}
Test
// 原型模式。 就是能够对之前的对象进行克隆, 然后产生一个新的对象
public class Test {
/**
* 浅克隆
* 1、实现 cloneenble 接口
* 2、重写 clone方法
*
* @param args
*/
public static void main(String[] args) throws CloneNotSupportedException {
test();
}
@SuppressWarnings("all")
static void test() throws CloneNotSupportedException {
// 1、新建原型对象
Date date = new Date();
user u1 = new user(1, "cyt", date);
user u2 = (user) u1.clone();
System.out.println("u1->" + u1);
System.out.println("u1.hashcode->" + u1.hashCode());
System.out.println("u2->" + u2);
System.out.println("u2.hashcode->" + u2.hashCode());
System.out.println("========================");
date.setTime(132456);
System.out.println("u1->" + u1);
System.out.println("u2->" + u2);
/**
* 重新设置原型的属性, clone 对象的值也会改变
*u1->user{id=1, name='cyt', date=Thu Apr 23 16:41:19 CST 2020}
* u1.hashcode->1807837413
* u2->user{id=1, name='cyt', date=Thu Apr 23 16:41:19 CST 2020}
* u2.hashcode->1254526270
* ========================
* u1->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
* u2->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
*/
}
}
二、深克隆
user
public class user implements Cloneable {
/**
* 修改 clone 方法, 成为深克隆
*
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
Object obj = super.clone();
// 对属性也克隆 , 实现深克隆
user u = (user) obj;
u.date = (Date) this.date.clone();
return obj;
}
private Integer id;
private String name;
private Date date;
}
test
// 原型模式。 就是能够对之前的对象进行克隆, 然后产生一个新的对象
public class Test {
/**
* 深克隆
* 1、实现 cloneenble 接口
* 2、重写 clone方法, 并修改, 外加克隆属性
*
* @param args
*/
public static void main(String[] args) throws CloneNotSupportedException {
test();
}
@SuppressWarnings("all")
static void test() throws CloneNotSupportedException {
// 1、新建原型对象
Date date = new Date();
user u1 = new user(1, "cyt", date);
user u2 = (user) u1.clone();
System.out.println("u1->" + u1);
System.out.println("u1.hashcode->" + u1.hashCode());
System.out.println("u2->" + u2);
System.out.println("u2.hashcode->" + u2.hashCode());
System.out.println("========================");
date.setTime(132456);
System.out.println("u1->" + u1);
System.out.println("u2->" + u2);
/**
* 重新设置原型的属性, clone 对象的值不会改变
u1->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
u1.hashcode->1807837413
u2->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
u2.hashcode->1254526270
========================
u1->user{id=1, name='cyt', date=Thu Jan 01 08:02:12 CST 1970}
u2->user{id=1, name='cyt', date=Thu Apr 23 16:46:17 CST 2020}
*/
}
}