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

原型模式

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;
    }

}
posted @ 2020-07-23 17:32  Mr-Lim  阅读(148)  评论(0编辑  收藏  举报