原型模式

浪子不回头ぞ 提交于 2019-11-25 18:50:11

模式介绍

原型模式是一种对象创建型模式,采用复制对象的方法来创建对象的实例。

浅克隆与深克隆

浅克隆: 克隆出来的对象实例一模一样,对象的属性如果是引用数据类型,那么他么指向同一个地址值。无论是修改原来的对象,还是修改克隆出来的对象,只要是引用数据类型修改了,那么两个对象同时被修改,因为他们共享同一地址值。

深克隆: 克隆出来的对象实例也是一模一样的,但是他们的引用属性也被克隆了,两个对象虽然一模一样,但是没有任何关联。修改其中一个对象,不影响另一个对象。

业务场景

以一个在线商城系统中的订单对象为例,一个订单的创建过程往往是很复杂的,这里我们列举几个基本类型的属性和引用类型的属性,来克隆订单对象,看看最终实现的效果。

代码实现

创建订单类,并实现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)));
    }
}

点击这里获取示例源码

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!