原型模式(克隆对象)

文章介绍了在Java中复制对象的两种方式:传统方式和原型模式,并详细阐述了深拷贝与浅拷贝的区别。通过重写clone方法和使用序列化技术来实现深拷贝,同时讨论了Spring中bean的创建。文章强调了在处理包含引用对象时,确保正确实现深拷贝的重要性。
摘要由CSDN通过智能技术生成

一、需求

有一只羊,姓名,年龄,id

复制10只属性相同的羊

二、传统方式

优点:易于理解

缺点:创建的对象复杂,效率低

改进:Java中所有的类都是Object的子类,使用Object中提供的clone方法,实现Cloneable接口

三、原型模式

步骤一 重写Sheep的clone方法

步骤二 调用Sheep的clone方法

四、Spring中使用

Spring中bean创建

五、深拷贝、浅拷贝

引用对象

深拷贝:复制一份一样的对象 hashCode(objA) != hashCode(objB)

浅拷贝: 引用对象地址相同,修改objA 也会影响 objB

思考:如果Sheep中存在引用对象,拷贝后,是深拷贝还是浅拷贝

如何完成super.clone中的深拷贝?

方式二、使用序列化

//深拷贝 - 方式2 通过对象的序列化实现 (推荐
    public Object deepClone() {
        
        //创建流对象
        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);
            DeepProtoType copyObj = (DeepProtoType)ois.readObject();
            
            return copyObj;
            
        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        } finally {
            //关闭流
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            } catch (Exception e2) {
                // TODO: handle exception
                System.out.println(e2.getMessage());
            }
        }
        
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值