zoukankan      html  css  js  c++  java
  • 原型模式

    原型模式

      原型模式: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图。

  • 相关阅读:
    Linux Shell 编程
    Linux下压缩与解压
    rsync实现文件备份同步
    linux中ulimit作用
    3dmax卡通渲染插件pencil+渲染线框
    世嘉开发部部长:这3点能提升游戏留存率
    消息中间件 分布式
    高并发高性能
    你的系统如何支撑高并发
    分布式系统的阿喀琉斯之踵:数据一致性
  • 原文地址:https://www.cnblogs.com/fightingtong/p/12859090.html
Copyright © 2011-2022 走看看