原型模式:就是通过自身对象创建一个和自身一样的数据结构,属性值的对象,就是源对象clone得到一个目标对象
根据clone的深浅分:浅clone和深clone
浅clone:
/**
*Cloneable只是一个空接口,实现该接口是告诉jvm这是一个可以被clone的类
*/
public class Person implements Cloneable{
private String name;
private int age;
private List<String> list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Person clone(){
try {
return (Person) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", list=" + list + "]";
}
}
public static void main(String[] args) {
Person p=new Person();
p.setName("小刘子");
p.setAge(3);
List l=new ArrayList();
l.add("啦啦");
l.add("百合");
p.setList(l);
Person p2 = p.clone();
p.getList().add("玫瑰");
p.setAge(1);
System.out.println("源对象"+p);
System.out.println("目标对象"+p2);
}
结果:
源对象Person [name=小刘子, age=1, list=[啦啦, 百合, 玫瑰]]
目标对象Person [name=小刘子, age=3, list=[啦啦, 百合, 玫瑰]]
通过测试结果可以知道,当源对象中有引用类型属性时,改变源对象中引用类型属性的值时,也会影响到目标对象。
造成这样的原因是:在clone时,对于对象中的引用类型属性只是clone它的引用地址
深clone:
/**
*Cloneable只是一个空接口,实现该接口是告诉jvm这是一个可以被clone的类
*/
public class Person implements Cloneable{
private String name;
private int age;
private List<String> list;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Person clone(){
try {
Person person=(Person)super.clone();
ArrayList list2=new ArrayList();
for(String str:this.list){
list2.add(str);
}
person.setList(list2);
return person;
} catch (CloneNotSupportedException e) {
return null;
}
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", list=" + list + "]";
}
}
测试
public static void main(String[] args) {
Person p=new Person();
p.setName("小刘子");
p.setAge(3);
List l=new ArrayList();
l.add("啦啦");
l.add("百合");
p.setList(l);
Person p2 = p.clone();
p.getList().add("玫瑰");
p.setAge(1);
System.out.println("源对象"+p);
System.out.println("目标对象"+p2);
}
结果
源对象Person [name=小刘子, age=1, list=[啦啦, 百合, 玫瑰]]
目标对象Person [name=小刘子, age=3, list=[啦啦, 百合]]
应用场景:改变目标对象值,不改变源对象