原型模式(非常简单)

1.浅克隆,如果People对象中有一个引用类型的属性,则克隆出来的对象会指向同一个对象

package cloneModel;


public class Person implements Cloneable{
private String head;
private String body;
private String foot;
public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
@Override
public String toString() {
return "Person [head=" + head + ", body=" + body + ", foot=" + foot + "]";
}

public Person clone(){
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}


}



public class mainTest {
public static void main(String[] args){
Person person=new Person();
person.setBody("yf body");
Person person2=person.clone();
System.out.println(person2.getBody());
System.out.println("==?"+(person==person2));
}

}


如果改变p1中body的值,p2不会改变。但如果person中有list,改变p1中list的值,p2中list也会改变。



浅拷贝是指在拷贝对象时,对于基本数据类型的变量会重新复制一份,而对于引用类型的变量只是对引用进行拷贝,

没有对引用指向的对象进行拷贝。

而深拷贝是指在拷贝对象时,同时会对引用指向的对象进行拷贝。

区别就在于是否对  对象中的引用变量所指向的对象进行拷贝。


如果想深度克隆的话,就得重写clone方法,单独处理引用类型的属性


改写后的:

package cloneModel;


import java.util.ArrayList;
import java.util.List;


public class Person implements Cloneable{
private String head;
private String body;
private String foot;

private List<String> habits;


public String getHead() {
return head;
}
public void setHead(String head) {
this.head = head;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getFoot() {
return foot;
}
public void setFoot(String foot) {
this.foot = foot;
}
 
public List<String> getHabits() {
return habits;
}
public void setHabits(List<String> habits) {
this.habits = habits;
}


@Override
public String toString() {
return "Person [head=" + head + ", body=" + body + ", foot=" + foot + ", habits=" + habits + "]";
}
public Person clone(){
try {
List<String> habit=new ArrayList<>();
for(String h:this.habits){
habit.add(h);
}
Person person= (Person) super.clone();
person.setHabits(habit);
return person;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}


}



package cloneModel;


import java.util.ArrayList;
import java.util.List;


public class mainTest {
public static void main(String[] args){
List<String> habits = new ArrayList<String>();
        habits.add("编程");
        habits.add("读书");
        Person p1 = new Person();
        p1.setBody("yfbody");
        p1.setHabits(habits);


        Person p2 = p1.clone();


        System.out.println("p1:" + p1);
        System.out.println("p2:" + p2);


        p1.getHabits().add("乒乓球");


        System.out.println("p1:" + p1);
        System.out.println("p2:" + p2);
        
        System.out.println("=============");
        p1.setBody("jkjk");
        System.out.println("p1:" + p1);
        System.out.println("p2:" + p2);
}
}



运行结果:

p1:Person [head=null, body=yfbody, foot=null, habits=[编程, 读书]]
p2:Person [head=null, body=yfbody, foot=null, habits=[编程, 读书]]
p1:Person [head=null, body=yfbody, foot=null, habits=[编程, 读书, 乒乓球]]
p2:Person [head=null, body=yfbody, foot=null, habits=[编程, 读书]]
=============
p1:Person [head=null, body=jkjk, foot=null, habits=[编程, 读书, 乒乓球]]
p2:Person [head=null, body=yfbody, foot=null, habits=[编程, 读书]]

猜你喜欢

转载自blog.csdn.net/weixin_40839342/article/details/80651466