结合JDK,Spring,Mybatis,Netty,Tomcat,Dubbo等经典框架的源码对设计模式展开分析(三)

本文详细介绍了原型模式(PrototypePattern)的概念及其在Java中的应用。通过实现Cloneable和Serializable接口,利用对象的序列化和反序列化进行深复制。文中还提供了具体的Java代码示例,展示了如何在原型类中实现clone方法,以提高对象创建的性能和效率。此外,文章讨论了浅复制和深复制的区别,并指出在处理引用对象时,深复制的必要性。
摘要由CSDN通过智能技术生成

原型模式(Prototype Pattern)

定义:指原型实例指定创建对象的类型,并且通过复制这些原型创建的对象,核心在于以系统中已存在的对象为原型,直接基于内存二进制流进行复制,不需要再经历对象初始化过程,提升了性能。

应用场景:对象创建成本较大,系统中大量使用该类对象各各调用者又都需要使用到它的属性的初始化值,并进行改动

角色:抽象原型规定复制接口(Object 中的clone()方法),具体原型实现该接口

Object源码中

protected native Object clone() throws CloneNotSupportedException;

Clone方法为native方法说明是其他语言实现的native方法的执行效率非常高

调用到object的clone方法,就是对调用者进行浅复制,并返回一个复制的object对象

原型模式的要点在于创建时不使用new创建,而是调用clone方法去克隆,如果目标对象有较多的引用对象,那么原生的浅复制肯定不满足要求(复制的是引用的地址),所以需要进行深复制,最便利的方式的利用序列化机制,序列化对象再反序列化出来

实现方式:实现cloneable接口和serializable接口,然后重写clone方法,方法中序列化对象然后反序列化出来,或者只实现cloneable接口,再clone方法之中手动“递归遍历”引用属性调用clone方法(super.clone即object的clone方法)不过这种方式太过原始化了。一般使用上面那种实现方式

package com.Prototype;

import java.io.*;

/**
 * @author yangxiaozhen
 * @date 2022/5/6-23:26
 */
public class PrototypePattern implements Cloneable, Serializable {
    public String a;

    public PrototypePattern(String a) {
        this.a = a;
    }

    @Override
    protected Object clone() {

        try {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ObjectOutputStream os = new ObjectOutputStream(outputStream);
            os.writeObject(this);
            ByteArrayInputStream in = new ByteArrayInputStream(outputStream.toByteArray());
            ObjectInputStream is = new ObjectInputStream(in);
            PrototypePattern o = (PrototypePattern) is.readObject();
            return o;

        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值