中年从原型模式到浅拷贝和深拷贝


问题
“ 如果你有一个对象 ,并希望生成与其完全相同的一个复制品 ,你该如何实现呢? 首先 ,你必须新建一个属于相同类的对象 。 然后 ,你必须遍历原始对象的所有成员变量 ,并将成员变量值复制到新对象中 。
中年从原型模式到浅拷贝和深拷贝
本文插图
for (int i = 0 i &lt 10 i++) { Sheep sheep = new Sheep("肖恩"+i+"号",2+i,"白色") System.out.println(sheep.toString())} 这种方式是比较容易想到的 , 但是有几个不足
在创建新对象的时候 , 总是需要重新获取原始对象的属性 , 如果创建的对象比较复杂 , 效率会很低
总是需要重新初始化对象 , 而不是动态地获得对象运行时的状态, 不够灵活
另一方面 , 并非所有对象都能通过这种方式进行复制 ,因为有些对象可能拥有私有成员变量 ,它们在对象本身以外是不可见的
“ 万物兼对象的 Java 中的所有类的根类 Object , 提供了一个 clone() 方法 , 该方法可以将一个 Java 对象复制一份 , 但是需要实现 clone() 的类必须要实现一个接口 Cloneable , 该接口表示该类能够复制且具有复制的能力 。这就引出了原型模式 。基本介绍 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类 , 并且通过拷贝这些原型 , 创建新的对象
原型模式是一种 创建型设计模式 ,使你能够复制已有对象 ,而又无需使代码依赖它们所属的类
工作原理是:通过将一个原型对象传给那个要发动创建的对象 , 这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建 , 即 对象**.clone**()
中年从原型模式到浅拷贝和深拷贝
本文插图
Prototype : 原型 (Prototype) 接口将对克隆方法进行声明
Java 中 Prototype 类需要具备以下两个条件
实现 Cloneable 接口 。 在 Java 语言有一个 Cloneable 接口 , 它的作用只有一个 , 就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用 clone 方法 。 在 Java 虚拟机中 , 只有实现了这个接口的类才可以被拷贝 , 否则在运行时会抛出 CloneNotSupportedException 异常
重写 Object 类中的 clone 方法 。 Java 中 , 所有类的父类都是 Object 类 , Object 类中有一个 clone 方法 , 作用是返回对象的一个拷贝
ConcretePrototype:具体原型 (Concrete Prototype) 类将实现克隆方法 。 除了将原始对象的数据复制到克隆体中之外 ,该方法有时还需处理克隆过程中的极端情况 ,例如克隆关联对象和梳理递归依赖等等 。
Client: 使用原型的客户端 , 首先要获取到原型实例对象 , 然后通过原型实例克隆自己 , 从而创建一个新的对象 。
实例
“ 我们用王二小放羊的例子写这个实例 1、原型类(实现 Clonable) @Setter@Getter@NoArgsConstructor@AllArgsConstructorclass Sheep implements Cloneable { private String name private Integer age private String color
@Override protected Sheep clone() { Sheep sheep = null try { sheep = (Sheep) super.clone() } catch (Exception e) { System.out.println(e.getMessage()) } return sheep }} 2、具体原型
按业务的不同实现不同的原型对象 , 假设现在主角是王二小 , 羊群里有山羊、绵羊一大群
中年从原型模式到浅拷贝和深拷贝
本文插图
public class Goat extends Sheep{ public void graze() { System.out.println("山羊去吃草") }} public class Lamb extends Sheep{ public void graze() { System.out.println("羔羊去吃草") }} 3、客户端 public class Client {


推荐阅读