设计模式:克隆模式

1.原型模式定义:

原型模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。用这种方式创建对象非常高效,根本无须知道对象创建的细节。

2.细节:

  • 抽象原型类:规定了具体原型对象必须实现的接口。
  • 具体原型类:实现抽象原型类的clone方法。

如果没有实现Cloneable接口则会抛异常:java.lang.CloneNotSupportedException

源码中解释如下:

Invoking Object's clone method on an instance that does not implement the Cloneable interface results in the exception CloneNotSupportedException being thrown.

代码实例:

(一)

@Data
public class People implements Cloneable{
    private String name;
    private String addr;
}

(二) 

import lombok.Data;

@Data
public class Employee extends People {
    private Long salary;

    public Employee() {
        super();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

(三)

class TestEmp {
    public static void main(String[] args) throws CloneNotSupportedException {
        Employee employee = new Employee();
        Object o = employee.clone();
        System.out.println(o instanceof Employee);
    }
}

运行结果:

------------------
true
-------------------

为此我们再来看一个问题,我们看Employee中重写的clone()方法:

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

有没有这样一个疑问:我操,我调用的是父类的clone()然后他返回的是一个object对对象,可是当我判断:

System.out.println(o instanceof Employee);的时候他竟然输出的是true,why???

答:Object中的clone执行的时候使用了RTTI(run-time  type  identification)的机制,动态得找到目前正在调用 clone方法的那个reference,根据它的大小申请内存空间,然后进行bitwise的复制,将该对象的内存空间完全复制到新的空间中去,从而达 到shallowcopy的目的。(参考博客:https://blog.csdn.net/naughty610/article/details/5307755

 

关于克隆,他到底是怎么克隆的呢?

博客推荐:https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484930&idx=1&sn=68bcd988c1658377e288a26a8effa17d&source=41#wechat_redirect(非常详细) 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章