码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-07-23 22:30:42      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:父类   对象   imageview   write   this   rri   说明   tps   view   

原型模式

技术图片

/**
 * 原型模式
 * <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种设计模式之创建型模式「原型模式」

标签:父类   对象   imageview   write   this   rri   说明   tps   view   

原文地址:https://www.cnblogs.com/Mr-Lim/p/13367586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!