设计模式之原型模式简单即复杂(二十四)

简单只是看不见的复杂, 这很原型, 传送


原型模式(proptotype pattern)定义

  • 用原型模式指定创建对象, 并且通过拷贝这些原型对象创建新的对象

原型模式的使用

  1. 对象的创建非常复杂, 可以使用原型模式快捷的创建对象
  2. 在运行过程中不知道对象的具体类型, 可使用原型模式创建一个相同类型的对象, 或者在运行过程中动态的获取到一个对象的状态
  3. 对于clone方法, 它执行的是浅拷贝, 也就是说如果是引用类型的属性, 则它不会进行拷贝, 而是只拷贝引用, 也就是说拷贝的对象中还有个成员对象引用
  4. 如果想要使用clone的深度拷贝, 那就需要重写clone

原型模式的优缺点

  • 优点:
    1. 由于clone方法是由虚拟机直接复制内存块执行, 所以在速度上比使用new的方式创建对象要快
    2. 可以基于原型, 快速的创建一个对象, 而无需知道创建的细节
    3. 可以在运行时动态的获取对下的类型以及状态, 从而创建一个对象
  • 缺点:
    1. 实现深度拷贝比较困难, 需要很多额外的代码量

navtive级别的clone深度解析

  • 轻度解析:
    1. 在jdk api的文档中 明确表示, clone是创建并且返回此对象的副本(即为依赖于对象的类)
    2. 必须实现Cloneable, 复制会报错
  • 深度解析: 这部分源码是汇编, 随意看看了解一下
    1. 先检测是否实现了cloneable
    2. 获取对象的大小
    3. 判断是否是数组 是就 ==>4 否则直接第5
    4. 获取长度
    5. 分配内存, 写入元数据
    6. copy内存块
    7. 初始化对象头, 包含哈市code ,gc信息, 锁信息
    8. 查看是否有finalize方法, 有就需要注册下
    9. 将内存对象转换为java本地对象返回

这块后面确实相当复杂, 还可以深度追击java内存模型等等

原文地址:https://www.cnblogs.com/denghailei/p/6857501.html