原型模式

原型模式

  原型模式:Prototype Pattern, PP

  原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

  创建型模型

  原型模式核心在于拷贝原型对象

  以系统中已存在的一个对象作为原型,直接基于内存二进制流进行拷贝(克隆),无需再经理耗时的对象初始化过程(不调用构造函数),使得新对象的创建时间大大减少,性能提升许多。

  对不通过new 关键字,而是通过对象拷贝来实现创建对象的模式就叫原型模式

  适用场景:
    1、类初始化消耗资源较多
    2、new 产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)
    3、构造函数比较复杂
    4、循环体中生产大量对象时

  在 Spring 中,原型模式应用的非常广泛,如:scope="prototype"
  常用的 JSON.parseObject()也是一种原型模式

  对于某个大对象如果有几百个属性需要复制,JDK 已经帮我们实现了一个现成的API,只需要实现 Cloneable 接口即可

  浅克隆:
    clone()
    只是完整复制了值类型数据,没有赋值引用对象(所有引用对象仍然指向原来的对象)

    只要是实现Cloneable的都是浅克隆!
    ArrayList重写clone()方法还是浅克隆,适用于集合元素搬家

  深克隆:
    深克隆就是完全不同的对象, 例如 克隆羊、孙悟空

    1、使用序列化实现深克隆

    2、使用多重clone(),只要有引用类型就做一层clone() (存在硬编码,更建议使用序列化实现深克隆)

    怎样做才能实现深克隆?
      1、序列化(转二进制流)
      2、转Json

  原型模式只对结果负责

  克隆破环单例模式:

    如果克隆的目标对象时单例对象,意味着,深克隆会破环单例。

  如何防止克隆破环单例?
  禁止深克隆
    方法:
    1、单例类不实现 Cloneable接口
    2、重写 clone()


  源码中的应用
    哪些接口实现了 Cloneable,即为原型模式

    ArrayList 类的实现


  优点:
    java 自带原型模式,基于内存二进制流拷贝,比直接 new 一个对象提升了性能
    使用深克隆方式可以用于保存对象的状态,在需要的时候可实现状态恢复

  缺点:
    需要为每个类配置克隆方法
    克隆方法位于类的内部,类改造需要修改代码,违背开闭原则
    在多重嵌套引用时,实现深克隆复杂


作业:

  用JSON方式实现一个原型模式的深克隆,并画出UML图。

 

posted @ 2020-05-09 17:38  离散音符  阅读(147)  评论(0编辑  收藏  举报