模式介绍
原型模式是一种对象创建型模式,采用复制对象的方法来创建对象的实例。
浅克隆与深克隆
浅克隆: 克隆出来的对象实例一模一样,对象的属性如果是引用数据类型,那么他么指向同一个地址值。无论是修改原来的对象,还是修改克隆出来的对象,只要是引用数据类型修改了,那么两个对象同时被修改,因为他们共享同一地址值。
深克隆: 克隆出来的对象实例也是一模一样的,但是他们的引用属性也被克隆了,两个对象虽然一模一样,但是没有任何关联。修改其中一个对象,不影响另一个对象。
业务场景
以一个在线商城系统中的订单对象为例,一个订单的创建过程往往是很复杂的,这里我们列举几个基本类型的属性和引用类型的属性,来克隆订单对象,看看最终实现的效果。
代码实现
创建订单类,并实现Cloneable接口:
public class Order implements Cloneable{
private String name;
private int price;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Order{" +
"name='" + name + '\'' +
", price=" + price +
", address='" + address + '\'' +
'}';
}
public Order clone() {
try {
Order order = (Order) super.clone();
order.setAddress(this.address);
order.setName(this.name);
order.setPrice(this.price);
return order;
} catch (CloneNotSupportedException e) {
e.printStackTrace();
return null;
}
}
}
创建Test类测试:
public class Test {
public static void main(String[] args) {
Order order1 = new Order();
order1.setPrice(100);
order1.setName("订单1");
order1.setAddress("北京市海淀区");
System.out.printf("order1:\n"+order1.toString()+"\n");
Order order2 = order1.clone();
System.out.printf("order2:\n"+order2.toString()+"\n");
System.out.printf(String.valueOf(order1.equals(order2)));
}
}
来源:CSDN
作者:csdn-coding
链接:https://blog.csdn.net/qiangzi1103/article/details/103200731