首页 > 其他分享 >设计模式-延迟加载(Lazy Load)

设计模式-延迟加载(Lazy Load)

时间:2024-08-15 10:24:54浏览次数:21  
标签:Load Lazy 映射器 对象 示例 加载 设计模式 方法 延迟

概念

一个对象,它虽然不包含所需要的所有数据,但是知道怎么获取这些数据。

加载一个对象会引起大量相关对象的加载,这样会损害系统的性能。延迟加载会暂时终止这个加载过程。

运行机制

四种实现延迟加载的方法:

  • 延迟初始化(Lazy initialization)。每次访问属性域都要先检查该域是否为空,如果为空,计算并返回这个域值。适用于活动记录、表数据入口和行数据入口模式。
  • 虚代理(virtual proxy)。既然是延迟加载,必然需要一个附加的间接层,虚代理是一个虚对象,只有当其中一个方法被调用时,才从数据库加载适当的对象。
  • 值保持器(value holder)。用来包装某个其他对象的对象,只有第一次访问值保持器时它真正从数据库读取数据。缺点:类需要知道它的存在。
  • 重影(ghost)。是部分状态下的真实对象。当从数据库加载对象时,只包含ID,每次要访问某个域时,会加载其完全状态。
     

一些讨论

延迟加载适合于面向方面的程序设计,置于一个单独的方面,可以独立改变延迟加载策略。
为不同的用例配备不同的延迟加载策略,往往能够使二者配合的很好。例如,如果使用数据映射器,就可以需要两个订单映射器对象,一个直接加载订单项,另一个对象延迟加载这些项。
使用相同的基本加载方法,使用不同的策略对象决定加载模式。

使用时机

  • 只有在域需要另外的数据库访问时才考虑使用延迟加载,对数据库同一记录的剩余部分实施延迟加载意义不大,即使其余部分的数据域很大。
  • 从性能角度看,实施延迟加载取决于什么时候想取回数据。对应同一个用户界面的一次交互时,一次取回所有数据最为理想。
  • 需要额外的调用,并且当使用主对象时,所调用的数据还没有用到的时候。
  • 使用延迟加载增加了编程的复杂程度,因此需要时才使用延迟加载。
     

示例-延迟初始化(java

示例-虚代理(java

示例目标:仅仅当供应商中的产品列表被首次访问时才生成一个产品list

实现思想:在数据映射器中先将延迟机制做预处理,为将来获取域list做准备

Step1 建立供应商虚列表类

Step2 需要一种机制,使得当虚列表实例化时,调用具体的生成列表代码(具体的产品列表加载方法)。

Step3 建立虚列表类

Step4映射器通过实例化具体的加载方法而不是虚加载方法,建立域列表

说明:setProducts方法的参数并不是List类型,虽不能直接使用,但可以由VirtualList类型中的方法返回,即VirtualList::source

总结:领域类不关心映射器如何进行延迟加载,延迟加载完全由虚代理自行维护。领域类通过虚代理建立域数据的触发时机是:虚代理中的getSource方法,进而触发ProductLoader中具体的load()方法。

示例-值保持器(java

示例说明:和虚代理模式相似,区别在于域list直接保存在值保持器中,List对象则由值保持器提供的方法返回,而虚代理保存在List类型依靠虚代理返回。

Step1 建立供应商值保持器类

Step2 需要一种机制,当访问值保持器时,需要向其传递相应代码。

Step3 映射器通过实例化具体的加载方法而不是虚加载方法,建立值保持器

说明:值保持器可以作为通用的延迟加载使用。

示例-使用重影(C#)

领域对象需要相应的映射器,为了避免直接调用依赖,需要合并注册表和分离接口

重影的加载序列:

标签:Load,Lazy,映射器,对象,示例,加载,设计模式,方法,延迟
From: https://blog.csdn.net/workflower/article/details/141131600

相关文章

  • LoadRunner常用函数介绍
    内置函数和Jmeter差不多,Jmeter更火,更好百度,毕竟开源,用的人多,所以有些函数如果不太懂用法,可以百度Jmeter作为参考来使用LR。 大家使用中应用函数不会的话留言就行,我开始用的时候反正不懂,不明白怎么使用,怎么应用,有和我一样的童鞋可交流脚本中常用函数事务组lr_start_transac......
  • LoadRunner内置参数介绍
    参数菜单我用的是2023版本,每个版本的位置不一样,通常差不多,2种方式进入参数菜单菜单栏进入参数点击设计-参数-参数列表脚本右键进入参数选中你要参数化的内容,右键:使用参数替换-参数列表参数列表左侧为参数的列表(NewParam为参数名,可自定义),右侧为参数的设置参数......
  • 设计模式-创建型模式1:单例模式+工厂模式
    单例模式单例模式是创建型设计模式核心思想:一个类只有一个实例,并提供一个全局访问点来访问这个实例单例设计模式的实现懒汉式:只有请求实例时才完成创建,需要使用了再创建;饿汉式:在类加载时,已经完成实例创建;适用场景资源共享;只有一个实例;懒加载:对象本身比较消耗资源,在......
  • GreatSQL 并行Load Data加快数据导入
    GreatSQL并行LoadData加快数据导入数据库信息数据库版本:GreatSQL8.0.32-25Clickhouse表需要导入到GreatSQL中,表数据量庞大所以选用导出CSV的方式。测试数据复现操作loaddataMySQLloaddata语句能快速将一个文本文件的内容导入到对应的数据库表中(一般文本的一行对应......
  • 【漏洞复现】LiveBos UploadFile 任意文件上传漏洞
              声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。一、漏洞描述LiveBOS,由顶点软件股份有限公司开发的对象型业务架构中间件及其集成开发工具,是一种创新的软件开发模式,以业......
  • 设计模式 - 装饰器模式
    ......
  • 设计模式 - 过滤器模式
    ......
  • LayUI Upload组件连续上传同一文件无反应
    可能原因:组件会缓存上次的上传历史,若是同一文件就不处理具体原因:待查解决方法:在choose里面增加如下语句“uploadListIns.config.elem.next()[0].value='' ”varuploadListIns=upload.render({elem:'#FileUpload',elemList:$('#FileList'),//列表元素对......
  • 【软件设计模式】策略模式详解
    策略模式策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式让算法的变化独立于使用算法的客户。组成策略接口(Strategy):定义了一个所有具体策略的通用接口,各种不同的策略都遵循这个接口,它声明了一个上下文用于执行策略的方法......
  • 【软件设计模式】 观察者模式详解
    观察者模式观察者模式是一种行为设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式特别适合于实现分布式系统中的事件处理系统,以及在需要在应用中实现广播通信时使用。组成发布者(Subject)会......