1. 类图
- Protoype:声明一个克隆自身的接口,用来约束想要克隆自己的类,要求它们都要实现这里定义的克隆方法
- ConcretePrototype:实现Prototype接口的类,这些类真正实现了克隆自身的功能
- Client:客户端,先获取原型实例对象,然后通过原型实例克隆自身来创建新的对象实例
2. 示例
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
浅克隆:只负责克隆按值传递的数据
深克隆:包括浅克隆和引用类型的数据
2.1 原型类
public class Product implements Cloneable {
private String productId;
private String name;
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Product{" +
"productId='" + productId + '\'' +
", name='" + name + '\'' +
'}';
}
@Override
protected Object clone() {
Object obj = null;
try {
obj = super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return obj;
}
}
2.2 克隆类
public class Order implements Cloneable {
private String customerName;
private Product product = null;
private int orderProductNum = 0;
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public int getOrderProductNum() {
return orderProductNum;
}
public void setOrderProductNum(int orderProductNum) {
this.orderProductNum = orderProductNum;
}
@Override
public String toString() {
return "Order{" +
"customerName='" + customerName + '\'' +
", product=" + product +
", orderProductNum=" + orderProductNum +
'}';
}
@Override
protected Object clone() {
Order order = null;
try {
order = (Order) super.clone();
// 实现深克隆
order.setProduct((Product) this.product.clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return order;
}
}
2.3 客户端
public class Client {
public static void main(String[] args) {
Product product = new Product();
product.setName("产品一");
Order order = new Order();
order.setProduct(product);
System.out.println(order);
Order clone = (Order) order.clone();
clone.getProduct().setName("产品二");
System.out.println(clone);
}
}