23种设计模式--原型模式

本文介绍了Java中的原型模式,通过一个具体的例子展示了如何使用浅拷贝和深拷贝创建对象的副本。在浅拷贝中,新对象的属性与原对象共享内存,而深拷贝则创建了属性引用对象的新副本,避免了内存地址的共享。文章还提供了一个`People`类的示例,展示了如何实现这两种拷贝方式,并在`Test`类中进行了测试。
摘要由CSDN通过智能技术生成

1、概述

        用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。

2、UML类图

3、代码示例

角色

  • 抽象原型类:规定了具体原型对象必须实现的的 clone() 方法。
  • 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
  • 访问类:使用具体原型类中的 clone() 方法来复制新的对象。

深拷贝和浅拷贝

  • 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
  • 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。注:Java中的Object类,提供了clone()方法来实现浅克隆。

抽象原型类

public interface Cloneable {
}

具体原型类

/**
 * 人类
 */
public class People implements Cloneable {

    private String name;

    private Ticket ticket;

    public People() {
    }

    public void show() {
        System.out.println(name + "有" + ticket.getNum() + "张票。");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Ticket getTicket() {
        return ticket;
    }

    public void setTicket(Ticket ticket) {
        this.ticket = ticket;
    }

    //浅拷贝:调用父类clone方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

    //深拷贝:通过流进行序列化和反序列化
    public Object deepCopy() throws IOException {
        //输出流
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        //输入流
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;
        try {
            //输出流
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this);

            //输入流
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            //转换成新的对象
            return ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            assert bos != null;
            bos.close();
            assert oos != null;
            oos.close();
            assert bis != null;
            bis.close();
            assert ois != null;
            ois.close();
        }
        return null;
    }

}

访问类

/**
 * 测试类
 */
public class Test {

    public static void main(String[] args) {
        //浅拷贝测试直接调用clone方法
        try {
            Ticket ticket = new Ticket();
            ticket.setNum(8);

            People people = new People();
            people.setName("Andy");
            people.setTicket(ticket);

            People people1 = (People) people.clone();
            people1.setName("tom");
            people1.getTicket().setNum(5);

            people.show();
            people1.show();
            System.out.println(people == people1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //深拷贝测试直接调用deepCopy方法,(调用比较简单不写了。)
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值