File tree Expand file tree Collapse file tree 3 files changed +144
-0
lines changed
DesignPattern/src/main/java/com/design/prototype Expand file tree Collapse file tree 3 files changed +144
-0
lines changed Original file line number Diff line number Diff line change 1+ package com .design .prototype ;
2+
3+ /**
4+ * 地址
5+ *
6+ * @author wliduo[i@dolyw.com]
7+ * @date 2023/2/1 17:32
8+ */
9+ public class Location implements Cloneable {
10+
11+ private StringBuffer address ;
12+ private String remark ;
13+
14+ public Location (StringBuffer address , String remark ) {
15+ this .address = address ;
16+ this .remark = remark ;
17+ }
18+
19+ @ Override
20+ protected Object clone () throws CloneNotSupportedException {
21+ // String基础属性可以不用处理,但是StringBuffer等引用对象需要处理
22+ Location location = (Location ) super .clone ();
23+ location .setAddress (new StringBuffer (address ));
24+ return location ;
25+ }
26+
27+ @ Override
28+ public String toString () {
29+ return "Location{" +
30+ "address=" + address +
31+ ", remark='" + remark + '\'' +
32+ '}' ;
33+ }
34+
35+ public StringBuffer getAddress () {
36+ return address ;
37+ }
38+
39+ public void setAddress (StringBuffer address ) {
40+ this .address = address ;
41+ }
42+
43+ public String getRemark () {
44+ return remark ;
45+ }
46+
47+ public void setRemark (String remark ) {
48+ this .remark = remark ;
49+ }
50+ }
Original file line number Diff line number Diff line change 1+ package com .design .prototype ;
2+
3+ /**
4+ * 原型模式 - 克隆,拷贝
5+ *
6+ * @author wliduo[i@dolyw.com]
7+ * @date 2023/2/1 17:32
8+ */
9+ public class Main {
10+
11+ public static void main (String [] args ) throws Exception {
12+ StringBuffer address = new StringBuffer ("深圳市南山区XXX" );
13+ Location location = new Location (address , "XXX村" );
14+ Person wangMing = new Person ("李明" , 20 , location );
15+ // 克隆wangMing
16+ Person liMing = (Person ) wangMing .clone ();
17+ // 修改原始对象
18+ wangMing .setName ("王明" );
19+ wangMing .setAge (30 );
20+ address .reverse ();
21+ location .setRemark ("XXX路" );
22+ // 输出原始和克隆对象,正常应该是深拷贝
23+ // 修改原始对象,克隆对象还是刚开始声明的属性
24+ // 将Person重写的clone方法对Location的克隆注释放开
25+ // 以及Location重写的clone方法对StringBuffer的克隆注释放开
26+ // 不然就会出现浅拷贝的问题
27+ System .out .println (wangMing );
28+ System .out .println (liMing );
29+ }
30+
31+ }
Original file line number Diff line number Diff line change 1+ package com .design .prototype ;
2+
3+ /**
4+ * 人,姓名,年龄,地址
5+ *
6+ * @author wliduo[i@dolyw.com]
7+ * @date 2023/2/1 17:32
8+ */
9+ public class Person implements Cloneable {
10+
11+ private String name ;
12+ private int age ;
13+ private Location location ;
14+
15+ public Person (String name , int age , Location location ) {
16+ this .name = name ;
17+ this .age = age ;
18+ this .location = location ;
19+ }
20+
21+ @ Override
22+ protected Object clone () throws CloneNotSupportedException {
23+ Person person = (Person ) super .clone ();
24+ // 基础属性String及int可以不用处理
25+ // 内置引用不重新进行克隆是浅拷贝,会导致指向同一个Location
26+ // 必须针对内部引用再次进行克隆,这样才是深拷贝
27+ person .setLocation ((Location ) location .clone ());
28+ return person ;
29+ }
30+
31+ @ Override
32+ public String toString () {
33+ return "Person{" +
34+ "name='" + name + '\'' +
35+ ", age=" + age +
36+ ", location=" + location +
37+ '}' ;
38+ }
39+
40+ public String getName () {
41+ return name ;
42+ }
43+
44+ public void setName (String name ) {
45+ this .name = name ;
46+ }
47+
48+ public int getAge () {
49+ return age ;
50+ }
51+
52+ public void setAge (int age ) {
53+ this .age = age ;
54+ }
55+
56+ public Location getLocation () {
57+ return location ;
58+ }
59+
60+ public void setLocation (Location location ) {
61+ this .location = location ;
62+ }
63+ }
You can’t perform that action at this time.
0 commit comments