From 4b26f4641e264bb8cb72c3aa9c6c1fe6592245e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Tue, 25 Sep 2018 23:11:50 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9B=86=E5=90=88=E7=B1=BB=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E6=B7=B1=E5=85=8B=E9=9A=86=E4=B8=8E=E6=B5=85=E5=85=8B=E9=9A=86?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prototype/clone/CMailAfter.java | 5 ++ .../prototype/clone/ListCloneAfter.java | 43 ++++++++++ .../prototype/clone/ListCloneBefore.java | 33 ++++++++ .../prototype/clone/ListCloneBeforeTest.java | 78 +++++++++++++++++++ 4 files changed, 159 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneAfter.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBefore.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBeforeTest.java diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/CMailAfter.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/CMailAfter.java index 43fdb6d..6cc396a 100644 --- a/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/CMailAfter.java +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/CMailAfter.java @@ -3,7 +3,9 @@ package top.fjy8018.designpattern.pattern.creational.prototype.clone; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.cache.CacheKey; +import java.util.ArrayList; import java.util.Date; /** @@ -12,6 +14,9 @@ import java.util.Date; *

* 邮件——深克隆实现 * + * JDK源码样例:{@link ArrayList#clone()} 通过元素拷贝实现 + * mybatis源码样例:{@link CacheKey#clone()} 通过重新初始化一个对象再进行数组拷贝实现 + * * @author F嘉阳 * @date 2018-09-25 20:39 */ diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneAfter.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneAfter.java new file mode 100644 index 0000000..48e3ebf --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneAfter.java @@ -0,0 +1,43 @@ +package top.fjy8018.designpattern.pattern.creational.prototype.clone; + +import lombok.Getter; +import lombok.Setter; +import org.apache.ibatis.cache.CacheKey; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * 对集合类原型模式实现 + * + * @author F嘉阳 + * @date 2018-09-25 22:59 + */ +@Getter +@Setter +public class ListCloneAfter implements Cloneable { + private String name; + private List dateList; + + @Override + public String toString() { + return "ListCloneBefore{" + + "name='" + name + '\'' + + ", dateList=" + dateList + + '}'; + } + + /** + * 重新实现集合类属性值拷贝方法,模仿{@link CacheKey#clone()} + * + * @return + * @throws CloneNotSupportedException + */ + @Override + protected Object clone() throws CloneNotSupportedException { + ListCloneAfter newInstance = (ListCloneAfter) super.clone(); + newInstance.setDateList(new ArrayList<>(this.dateList)); + return newInstance; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBefore.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBefore.java new file mode 100644 index 0000000..89ddc74 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBefore.java @@ -0,0 +1,33 @@ +package top.fjy8018.designpattern.pattern.creational.prototype.clone; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Date; +import java.util.List; + +/** + * 对集合类原型模式实现 + * + * @author F嘉阳 + * @date 2018-09-25 22:59 + */ +@Getter +@Setter +public class ListCloneBefore implements Cloneable { + private String name; + private List dateList; + + @Override + public String toString() { + return "ListCloneBefore{" + + "name='" + name + '\'' + + ", dateList=" + dateList + + '}'; + } + + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBeforeTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBeforeTest.java new file mode 100644 index 0000000..1fdbeac --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/prototype/clone/ListCloneBeforeTest.java @@ -0,0 +1,78 @@ +package top.fjy8018.designpattern.pattern.creational.prototype.clone; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +@Slf4j +class ListCloneBeforeTest { + + /** + * 由输出可知,集合类属性值传递的也是引用 + * output + * === + * 7f13d6e ListCloneBefore{name='初始', dateList=[Thu Jan 01 08:00:00 CST 1970, Tue Sep 25 23:05:17 CST 2018]} + * 1e965684 ListCloneBefore{name='初始', dateList=[Thu Jan 01 08:00:00 CST 1970, Tue Sep 25 23:05:17 CST 2018]} + * 7f13d6e ListCloneBefore{name='初始', dateList=[Tue Sep 25 23:05:17 CST 2018]} + * 1e965684 ListCloneBefore{name='初始', dateList=[Tue Sep 25 23:05:17 CST 2018]} + * === + * + * @throws Exception + */ + @Test + void cloneBefore() throws Exception { + List dates = new ArrayList<>(); + dates.add(new Date(0L)); + dates.add(new Date()); + + ListCloneBefore before = new ListCloneBefore(); + before.setName("初始"); + before.setDateList(dates); + ListCloneBefore after = (ListCloneBefore) before.clone(); + + log.info(Integer.toHexString(before.hashCode()) + " " + before); + log.info(Integer.toHexString(after.hashCode()) + " " + after); + + dates.remove(0); + before.setDateList(dates); + + log.info(Integer.toHexString(before.hashCode()) + " " + before); + log.info(Integer.toHexString(after.hashCode()) + " " + after); + } + + /** + * 改造后输出符合预期 + * output + * === + * 7f13d6e ListCloneBefore{name='初始', dateList=[Thu Jan 01 08:00:00 CST 1970, Tue Sep 25 23:10:32 CST 2018]} + * 1e965684 ListCloneBefore{name='初始', dateList=[Thu Jan 01 08:00:00 CST 1970, Tue Sep 25 23:10:32 CST 2018]} + * 7f13d6e ListCloneBefore{name='初始', dateList=[Tue Sep 25 23:10:32 CST 2018]} + * 1e965684 ListCloneBefore{name='初始', dateList=[Thu Jan 01 08:00:00 CST 1970, Tue Sep 25 23:10:32 CST 2018]} + * === + * + * @throws Exception + */ + @Test + void cloneAfter() throws Exception { + List dates = new ArrayList<>(); + dates.add(new Date(0L)); + dates.add(new Date()); + + ListCloneAfter before = new ListCloneAfter(); + before.setName("初始"); + before.setDateList(dates); + ListCloneAfter after = (ListCloneAfter) before.clone(); + + log.info(Integer.toHexString(before.hashCode()) + " " + before); + log.info(Integer.toHexString(after.hashCode()) + " " + after); + + dates.remove(0); + before.setDateList(dates); + + log.info(Integer.toHexString(before.hashCode()) + " " + before); + log.info(Integer.toHexString(after.hashCode()) + " " + after); + } +} \ No newline at end of file