原型模式中的深克隆和浅克隆

Posted 前进道路上的程序猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原型模式中的深克隆和浅克隆相关的知识,希望对你有一定的参考价值。

前言

原型模式是指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。
在原型模式中,我们涉及到浅克隆和深克隆这两个概念,浅克隆中引用对象仍然指向原来的对象,深克隆则指向新的对象,下面我们就用案例来解释

案例

我们新建两个类,课程类和视频类,每个课程都有相应的视频
Video :

public class Video implements Serializable 
    private String videoName;

Course :

public class Course implements Cloneable, Serializable 
    public Date day;
    public Video video;
    public Course() 
        this.day = new Date();
        this.video = new Video();
    
    protected Object clone() throws CloneNotSupportedException
        return this.deepClone();
    
    public Object deepClone() 
        try
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            ByteArrayInputStream bis =  new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            Course copy = (Course)ois.readObject();
            copy.day = new Date();
            return copy;
         catch (Exception e)
            e.printStackTrace();
            return null;
        
    
    public Course shallowClone(Course target) 
        Course course = new Course();
        course.video = target.video;
        course.day = new Date();
        return course;
    

视频类Video 有名字属性videoName,并且实现Serializable 接口
课程类Course 有日期属性day和视频类属性Video ,并且实现Cloneable和Serializable 接口
深克隆中使用序列化与反序列化,浅克隆则是直接用目标对象复制属性到新对象

测试

CloneTest :

public class CloneTest 
    public static void main(String[] args) 
        Course course = new Course();
        try
            Course clone = (Course)course.clone();
            System.out.println("深克隆"+(course.video == clone.video));
         catch (Exception e)
            e.printStackTrace();
        
        Course q = new Course();
        Course n = q.shallowClone(q);
        System.out.println("浅克隆"+(q.video == n.video));
    

以上是关于原型模式中的深克隆和浅克隆的主要内容,如果未能解决你的问题,请参考以下文章

原型模式的深克隆和浅克隆

Java中的深克隆和浅克隆

从克隆(深浅拷贝)到原型设计模式

设计模式之原型模式

Git 浅克隆

设计模式学习--原型模式