Java23种设计模式之创建型模式「原型模式」

Posted Mr.Lim

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java23种设计模式之创建型模式「原型模式」相关的知识,希望对你有一定的参考价值。

原型模式

技术图片

/**
 * 原型模式
 * <p>
 * 浅复制(浅克隆):将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的
 * 深复制(深克隆):不管是基本数据类型还是引用类型,都会重新创建。简单来说:就是深复制进行了完全彻底的复制
 * <p>
 * 注:
 * 实现 Cloneable 接口,并覆盖其clone方法,并且声明为 public
 * 浅复制和深复制建议不要混合使用,一个类中某些引用使用的浅复制,某些引用使用了深复制
 * 这是一种非常差的设计,特别是在涉及到类的继承,父类有几个引用的情况就非常复杂
 * 建议深复制和浅复制分开实现
 * <p>
 * 说明:
 * 这里在一个对象类里面写了两个复制逻辑,只是为了方便查看和学习
 *
 * @author Mr.Lim
 */
public class Prototype implements Cloneable, Serializable {
    private static final long serialVersionUID = -2911276289956526976L;

    /**
     * 姓名
     */
    public String name;

    /**
     * 年龄
     */
    public Integer age;

    /**
     * 学生信息对象
     */
    public Student student;

    /**
     * 浅复制
     */
    @Override
    public Prototype clone() {
        Prototype prototype = null;
        try {
            prototype = (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return prototype;
    }

    /**
     * 深复制
     * <p>
     * 注:
     * 本对象和对象里面引用的对象都要实现 java.io.Serializable 接口
     */
    public Prototype deepClone() {

        try {
            // 写入当前对象的二进制流
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
            oos.writeObject(this);

            // 读取当前对象的二进制流
            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(byteArrayInputStream);
            return (Prototype) ois.readObject();

        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

}

以上是关于Java23种设计模式之创建型模式「原型模式」的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之原型模式

java中23种设计模式

创建型设计模式 之 原型模式

23种设计模式Java版第一篇

Java的23种设计模式详解整理之创建型模式

23种设计模式