大白话原型模式(Prototype Pattern)

意图

原型模式是建立型设计模式,能够复制已存在的对象而无需依赖它的类。java

问题

假如如今有一个对象,咱们想彻底复制一份新的,咱们该如何作?编程

  1. 建立同一个类的新对象
  2. 遍历全部已存在对象的值,而后将他们的值复制到新对象。

很好,可是咱们会发现存在以下问题:设计模式

  1. 该对象的值并不必定全对对外开放,好比Java中的private,外部没法访问。
  2. 使用这种办法必须知道该对象所属的类并且依赖这个类。
  3. 有些时候咱们只知道该对象实现的接口,而不是具体的实现类。

解决

这个时候咱们就须要原型模式。原型模式将克隆过程委托给被克隆的对象。该模式为全部支持克隆的对象声明一个公共接口,这个接口容许克隆一个对象,而没必要将代码和该对象的类耦合。一般,这样的接口只包含一个克隆方法。编程语言

克隆方法的实如今全部类中都很是类似。该方法建立当前类的一个对象,并将旧对象的全部字段值转移到新对象中。这样就能够复制私有字段,由于大多数编程语言都容许对象访问属于同一类的私有字段。函数

结构

原型模式类图

原型模式包含以下角色prototype

  • Prototype:它是声明克隆方法的接口,是全部具体原型类的公共父类,能够是抽象类也能够是接口,甚至还能够是具体实现类。
  • ConcretePrototype:它实如今抽象原型类中声明的克隆方法,在克隆方法中返回本身的一个克隆对象

实例

在Java中,全部的类都继承了java.lang.Object。Object提供了clone方法能实现Java对象复制。
咱们只需注意两点便可。设计

  1. 实现克隆的Java类必须实现一个标识接口Cloneable,表示这个Java类支持被复制。若是没有实现这个接口但调用了clone()方法,Java编译器将抛出一个CloneNotSupportedException异常。
  2. 浅克隆和深克隆
    java的clone函数只是“浅克隆”,也就是仅对变量值作复制。若是是引用变量,其内容指向的内存地址是不变的。

参考文献

https://refactoring.guru/design-patterns/prototype对象

相关文章
相关标签/搜索