原型模式(Prototype) - 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Java可以通过实现Cloneable接口,并覆盖(Override) clone() 方法来实现。分为”浅拷贝”和”深拷贝”:
浅拷贝: 对引用类型的成员变量只克隆引用,不克隆引用的对象。
深拷贝: 对引用类型的成员变量也进行引用对象的克隆。
类图:
案例: 深拷贝
public class Address implements Cloneable {
private String homeAddress;
private String postCode;
public Address(String homeAddress, String postCode) {
super();
this.homeAddress = homeAddress;
this.postCode = postCode;
}
public String getHomeAddress() {
return homeAddress;
}
public String getPostCode() {
return postCode;
}
public Object clone() {
try {
return super.clone();
} catch (CloneNotSupportedException e) {
//do something
return null;
}
}
}
public class Employee implements Cloneable{
private String employeeId;
private String name;
private Address address;//cloneable
public Employee(String employeeId, String name, Address address) {
this.employeeId = employeeId;
this.name = name;
this.address = new Address(address.getHomeAddress(), address.getPostCode());//defensive copy
}
public Object clone() {
Employee employee = null;
try {
employee = (Employee)super.clone();
employee.address = (Address)this.address.clone();
} catch (CloneNotSupportedException e) {
//do something;
}
return employee;
}
}