zoukankan      html  css  js  c++  java
  • 设计模式之原型模式简单即复杂(二十四)

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


    原型模式(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内存模型等等

  • 相关阅读:
    HDU 1082 Matrix Chain Multiplication
    HDU 1086 You can Solve a Geometry Problem too
    HDU 1099 Lottery
    jquery正则检测字符串表达式的合法性
    Like语句中的注入
    HDU 1372 Knight Moves
    HDU 1253 胜利大逃亡
    HDU 1242 Rescue
    我有新博客啦
    水平越权与垂直越权
  • 原文地址:https://www.cnblogs.com/denghailei/p/6857501.html
Copyright © 2011-2022 走看看