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

news2024/9/24 9:22:02

概念

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

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

运行机制

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

  • 延迟初始化(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#)

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

重影的加载序列:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2033781.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThreadLocal —— 让每个线程拥有自己的变量副本

在多线程编程中,数据共享是一个常见的话题。很多时候我们需要多个线程共享同一个数据,以实现数据的一致性和通信。然而,在一些场景下,我们并不希望数据被多个线程共享,而是希望每个线程都拥有自己独立的一份数据。这时…

【C++类和对象(中)】—— 我与C++的不解之缘(四)

前言: 接下来进行类和对象中的学习,了解类和对象的默认成员函数 一、类和对象默认成员函数 默认成员函数就是用户没有显示实现,编译器会自动生成的成员函数。 一个类,我们不显示实现的情况下,编译器就会默认生成一下留…

无人机开启农林植保新篇章

嘿,小伙伴们,你们知道吗?无人机已经悄悄在农业领域大展拳脚,成为现代农业的“黑科技”新宠儿啦! 想象一下,广袤的田野上空,无人机如同勤劳的蜜蜂,精准高效地完成着各项任务&#xff…

unity 使用 compute shader的步骤

这里详细的记载使用步骤,我这个例子是让一个立方体上下不停的动 创建一个compute shader 一个普通shader 一个材质 一个C# 先挨个写上类容 这里kernel 指定main函数入口,RWStructuredBuffer就是数组,具体size是在外部指定的,可能…

C#使用CEFSharp获取动态网页源码

CEF 全称是Chromium Embedded Framework(Chromium嵌入式框架),是个基于Google Chromium项目的开源Web browser控件,支持Windows, Linux, Mac平台。CEFSharp就是CEF的C#移植版本。 访问以下链接可以获取CEF的详细介绍 chromiumem…

c++版opencv长文指南

c版opencv长文指南 1、配置opencv库1.1 下载1.2 配置1.2.1 配置包含目录1.2.2 配置库含目录1.2.3 配置链接器1.2.4 配置系统环境变量 2、学习路线3、入门知识3.1 图像读取与显示3.2 图像色彩空间转换3.2 图像对象的创建与赋值3.2.1 图像对象的创建3.2.2 图像对象的赋值 3.3 图像…

轻松搞定小程序生成短链接/二维码,你学会了吗?

朋友们,大家有没有遇到过这样的困扰:小程序由于不是链接,在短信或者其他平台里根本没法推广,导致小程序的用户量很难涨起来。 那小程序转成链接真的就没办法实现吗?当然不是! 现在有一款超实用的工具——…

zigbee笔记:十、ZStack(2.3.0-1.4.0)的OSAL使用分析

zigbee笔记:九中,我们已经学会了利用模板,定制自己的个性开发工程,本文为协议栈(ZStack-CC2530-2.3.0-1.4.0)代码使用分析笔记,来进一步掌握协议栈的使用。 一、协议栈使用知识点 1、协调器、路…

python从入门到精通:基础语法讲解

1、字面量 字面量:在代码中,被写下来的固定的值,称之为字面量。 python中常用的几种数据类型: 类型描述说明数字(Number) 整数(int) 浮点数(float) 复数&a…

Graph-Cot:图上迭代推理

Graph-Cot:图上迭代推理 提出背景GRAPH-COT 对比 MindMapGRAPH-COT 和 MindMap 多链推理方法结合案例一:复杂症状的诊断案例二:罕见病的诊断案例三:治疗方案的制定 解法拆解目的问题解法 GRAPH-COT 医学问诊 论文:http…

(BO)Bayes-CNN多变量时序预测 基于贝叶斯算法-卷积神经网络多变量时序预测(多输入单输出)Matlab代码

Bayes-CNN多变量时序预测 基于贝叶斯算法-卷积神经网络多变量时序预测(多输入单输出)Matlab代码 程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!(如下) 需要其他的都可以…

CSS3下拉菜单实现

导航菜单&#xff1a; <nav class"multi_drop_menu"><!-- 一级开始 --><ul><li><a href"#">Power</a></li><li><a href"#">Money</a></li><li><a href"#"…

【数模修炼之旅】02 多目标规划 深度解析(教程+代码)

【数模修炼之旅】02 多目标规划 深度解析&#xff08;教程代码&#xff09; 接下来 C君将会用至少30个小节来为大家深度解析数模领域常用的算法&#xff0c;大家可以关注这个专栏&#xff0c;持续学习哦&#xff0c;对于大家的能力提高会有极大的帮助。 1 多目标规划介绍及应…

百度智能云发布3款轻量级+2款场景大模型

文心大模型ERNIE 3.5是目前百度智能云千帆大模型平台上最受欢迎的基础大模型之一。针对用户的常见通用的对话场景&#xff0c;ERNIE 3.5 在指令遵循、上下文学习和逻辑推理能力三方面分别进行了能力增强。 ERNIE Speed作为三款轻量级大模型中的“大个子”&#xff0c;推理场景…

解决连接不上Linux和服务器中的Nacos(Windows中能连接但是Linux中却不行)

报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in the SynchronizationContext. Re-thrown. at com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.jav 2024-08-13T10:21:52.93708:00 ERROR 27764 --- …

ArduPilot开源代码之FMU+IOMCU设计

ArduPilot开源代码之FMUIOMCU设计 1. 源由2. 设计概念3. FMU & IOMCU特点3.1 FMU&#xff08;Flight Management Unit&#xff09;的主要功能3.2 IOMCU&#xff08;Input/Output Microcontroller Unit&#xff09;的主要功能3.3 主要差异 4. 主/辅助(MAIN/AUX) PWM输出5. 软…

【北京仁爱堂】痉挛性斜颈的早期症状,你了解吗?

在日常生活中&#xff0c;您可能很少听到“痉挛性斜颈”这个名词&#xff0c;但它却是一种不容忽视的疾病。今天&#xff0c;就让我们一起来了解一下痉挛性斜颈的早期症状&#xff0c;以便能够及时发现并采取相应的措施。 痉挛性斜颈是一种局限性肌张力障碍疾病&#xff0c;主要…

Gitlab搭建服务器好做吗 Gitlab搭建服务器操作指南

GitLab是一个强大的开源代码托管和CI/CD工具&#xff0c;广泛用于软件开发的版本控制和自动化构建。对于许多公司和开发团队来说&#xff0c;自行搭建GitLab服务器是一个既具挑战性又有很多好处的选择。本文将详细讨论搭建GitLab服务器的难易程度&#xff0c;提供一份详尽的操作…

死信队列.

“死信”是指在RabbitMQ中那些因为某些原因无法被正常处理的消息。

OpenCV图像滤波(11)中值滤波medianBlur函数的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 功能描述 该函数使用中值滤波器对图像进行模糊处理。 该函数采用 ksizeksize 的窗口尺寸对图像进行平滑处理。对于多通道图像&#xff0c;每个通道将被独…