设计模式之原型模式简单即复杂(二十四)
原型模式(proptotype pattern)定义
- 用原型模式指定创建对象, 并且通过拷贝这些原型对象创建新的对象
原型模式的使用
- 对象的创建非常复杂, 可以使用原型模式快捷的创建对象
- 在运行过程中不知道对象的具体类型, 可使用原型模式创建一个相同类型的对象, 或者在运行过程中动态的获取到一个对象的状态
- 对于clone方法, 它执行的是浅拷贝, 也就是说如果是引用类型的属性, 则它不会进行拷贝, 而是只拷贝引用, 也就是说拷贝的对象中还有个成员对象引用
- 如果想要使用clone的深度拷贝, 那就需要重写clone
原型模式的优缺点
- 优点:
- 由于clone方法是由虚拟机直接复制内存块执行, 所以在速度上比使用new的方式创建对象要快
- 可以基于原型, 快速的创建一个对象, 而无需知道创建的细节
- 可以在运行时动态的获取对下的类型以及状态, 从而创建一个对象
- 缺点:
- 实现深度拷贝比较困难, 需要很多额外的代码量
navtive级别的clone深度解析
- 轻度解析:
- 在jdk api的文档中 明确表示, clone是创建并且返回此对象的副本(即为依赖于对象的类)
- 必须实现Cloneable, 复制会报错
- 深度解析: 这部分源码是汇编, 随意看看了解一下
- 先检测是否实现了cloneable
- 获取对象的大小
- 判断是否是数组 是就 ==>4 否则直接第5
- 获取长度
- 分配内存, 写入元数据
- copy内存块
- 初始化对象头, 包含哈市code ,gc信息, 锁信息
- 查看是否有finalize方法, 有就需要注册下
- 将内存对象转换为java本地对象返回
这块后面确实相当复杂, 还可以深度追击java内存模型等等