【“别跟我不会”系列】Java设计模式之原型模式

  • 2019 年 10 月 8 日
  • 筆記

想了解其它设计模式的欢迎关注本公众号联系小编获得相关内容。 —— 23号老板

0

1

引入

原创:爱吃回锅肉的瘦子

原型模式是用于创建重复对象,同时保证性能,一般应用场景是我们需要重复创建多个对象,例如在循环体中赋值一个对象。原型模式是用于创建重复对象,同时保证性能,一般应用场景是我们需要重复创建多个对象,例如在循环体中赋值一个对象。

0

2

思路

它是通过给出一个原型对象来指明所创建得对象的类型,然后使用自身的克隆接口来复制这个原型对象,以此来创建出更多同种类型的对象。

0

3

代码

//实现Cloneable 接口的原型抽象类 cloneTypeTest  class CloneTypeTest implements Cloneable {      //重写clone方法      @Override      protected CloneTypeTest clone() throws
CloneNotSupportedException {
        CloneTypeTest cloneTypeTest = null;          cloneTypeTest = (CloneTypeTest) super.clone();
        return cloneTypeTest;      }  }    //实现原型类  class ChildCloneTypeTest extends CloneTypeTest {      public void show() {          System.out.println("原型实现类");      }  }    class Client {      public static void main(String[] args) {          ChildCloneTypeTest childCloneTypeTest =
new ChildCloneTypeTest();          for (int i = 0; i < 10; i++) {              try {                  ChildCloneTypeTest cp =
(ChildCloneTypeTest) childCloneTypeTest.clone();                  cp.show();              } catch (CloneNotSupportedException e) {                  e.printStackTrace();              }            }      }  }

0

4

实现核心

1. 实现Cloneable接口:与序列化接口的作用相似,只是告诉虚拟机可以安全的使用clone方法,否则会抛出CloneNotSupportedException的异常。

2. 重写父类Object的clone方法,作用是返回一个copy。

3. 在重写的方法中调用super.clone:默认情况下,类不具备复制对象的能力,需要调用super.clone方法。父类的clone方法是naive方法,直接操作内存的二进制流,特别是复制大对象时,性能差异非常明显。当然了这边的clone形式也可以自定义,比如使用序列化形式(可以解决Cloneable浅拷贝问题)。

Clone方法的注意问题:

调用super.clone方法之后,首先检查当前对象是否支持clone,也就是检查当前对象所属的类是否实现了Cloneable接口,如果支持则创建当前对象所属的类的一个新对象并初始化,使新对象的成员变量的值与当前对象的成员变量的值一模一样,但是对于其他对象的引用以及list等类型的成员属性,是只能复制这些对象的引用。所以简单使用super.clone是浅拷贝。对于浅拷贝带来了一个问题,就是当前对象a里的有个成员变量是指向了一个对象 b,这个b对象里的属性改变了,会引起对象a的clone对象里的b对象也会跟着改变。因此 我们在使用原型模式时候,一定要注释清楚,这个问题,防止下一个接手的程序员忽视了这个坑的存在。当然了 我们可以使用深拷贝来解决这个问题,而深拷贝就是基于浅拷贝来递归实现具体的每个对象。

0

5

应用场景

在一些重复创建对象的场景下,例如一个循环体重复创建同一个对象,我们就可以使用原型模式来提高对象的创建性能。尤其是循环上万次,大对象的情况下,使用new和使用原型模式性能差异非常明显。

不信的话,各位看客老爷亲自可以试验一下。

Spring框架中的使用:其中注解@Scope(“prototype”)为原型模式。