原型模式:克隆一个和原型一模一样的对象,浅拷贝和深拷贝。
浅拷贝:创建一个对象,里面的属性对象复制原属性的引用
深拷贝:创建一个对象,里面的属性对象也需要创建一个新对象
使用场景:
1、当创建一个对象非常繁琐复杂时,使用原型模型
2、需要的对象数据不用修改时
代码示例:
import java.util.ArrayList;
import java.util.List;
public class User implements Cloneable{
private String name;
private ArrayList<String> arrayList = new ArrayList<>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getArrayList() {
return arrayList;
}
public void addArrayList(String s) {
this.arrayList.add(s);
}
//浅拷贝
public User shallowClone() throws CloneNotSupportedException {
User userClone = (User) super.clone();
return userClone;
}
//深拷贝,里面的基本类型不用深拷贝,对象类型需要深拷贝
public User deepClone() throws CloneNotSupportedException {
User userClone = (User) super.clone();
userClone.arrayList = (ArrayList<String>) this.arrayList.clone();
return userClone;
}
public static void main(String[] args) throws CloneNotSupportedException {
User user = new User();
user.setName("a");
user.addArrayList("x");
User shallowClone = user.shallowClone();
User deepClone = user.deepClone();
//结果一: false, 克隆的对象都是一个新对象,只不过里面的属性有浅拷贝和深拷贝之分
System.out.println("结果一: "+(user==shallowClone));
shallowClone.setName("b");
deepClone.setName("c");
//结果二: a, 常量不存在深浅拷贝之分,拷贝对象修改常量属性值,不会修改原对象常量属性值
System.out.println("结果二: "+ user.getName());
shallowClone.addArrayList("y");
deepClone.addArrayList("z");
//结果二: [x, y], 浅拷贝对象修改对象值后,原对象属性值也被修改,深拷贝对象修改属性值后原对象不会被修改
System.out.println("结果三: "+ user.getArrayList().toString());
}
}
结果:
结果一: false
结果二: a
结果三: [x, y]