原型模式(clone)

原型模式(clone)

概念 按照原型直接copy一个新的
角色 image1

属于

浅拷贝

新地址 + 旧引用

image2

好处
  1. 在数据量大的情况下直接克隆,比新建对象性能好很多

  2. string不可变,赋新值会创建新的string,所以不一样

  3. image3

出现原因

与其从零开始创建一个新对象,不如:

先复制一个现有的对象(原型),再按需修改

这就像拿一张模板复印一样,而不是重新画一张。

使用方法

你只要把类实现 Cloneable 接口并重写 clone(),

就能直接“复制”一个几乎相同的新对象。

深克隆

对于一个class{class student},如果我们直接clone这个class,
那么我们用的就是原型的student,如果对于student的name进行修改,
那么原型的name也会被修改, 因此我们要用到深克隆.

image4

方法1: 不仅复制对象本身,还要复制它所引用的对象

方法2: 通过序列化 / 反序列化实现(jvm反序列化会创建一个全新的对象)
(类也必须实现序列化接口)

方法3: 通过json序列化

方法4: 方法2的封装:

  • Apache Commons Lang:SerializationUtils.clone(object)

  • Hutool:ObjectUtil.cloneByStream(object)

  • Spring:某些 BeanUtils 工具类也能部分支持深拷贝(不过是属性级的)