当前位置: 首页 > news >正文

【前端设计模式】之享元模式

享元模式是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。在前端开发中,享元模式可以用于优化大量相似对象的创建和管理,从而提高页面的加载速度和用户体验。

享元模式特性

  1. 共享对象:享元模式通过共享相似对象来减少内存使用。相似对象可以共享一些不变的状态,而将可变的状态作为外部参数传入。
  2. 内部状态和外部状态:享元对象分为内部状态和外部状态。内部状态是不变的,可以被多个对象共享;外部状态是可变的,需要在运行时传入。
  3. 工厂管理:享元模式通常使用工厂来创建和管理共享对象。

应用示例

1. 图片懒加载

在一个页面中可能有多个图片需要加载,但是它们的显示区域可能重叠或者离用户可见区域较远。我们可以使用一个图片懒加载的工厂来创建图片对象,并将图片的URL作为外部参数传入。这样可以避免重复创建相同URL的图片对象,并且只有当图片进入用户可见区域时才进行加载。

 
// 图片懒加载工厂
const imageFactory = (function() {const imageCache = {};return {createImage: function(url) {if (imageCache[url]) {return imageCache[url];} else {const img = new Image();img.src = url;imageCache[url] = img;return img;}}};
})();// 使用图片懒加载工厂创建图片对象
const img1 = imageFactory.createImage('image1.jpg');
const img2 = imageFactory.createImage('image2.jpg');

  1. 首先,通过自执行函数创建了一个封闭的工厂函数 imageFactory,这个函数返回一个对象,包含了 createImage 这个方法。
  2. 在这个工厂函数内部,创建了一个名为 imageCache 的对象,用于缓存已经创建过的图片对象。
  3. createImage 方法接收一个 URL 参数,然后根据这个 URL 创建一个新的图片对象。如果 imageCache 中已经存在该 URL 的图片对象,就直接返回缓存的版本,否则就创建一个新的图片对象并将其缓存。
  4. 最后,通过调用 imageFactory.createImage 方法,分别创建了两个图片对象 img1 和 img2

通过这种方式,当多次请求同一个 URL 的图片时,可以直接从缓存中获取,避免了重复的 HTTP 请求,提高了性能。同时,由于图片对象是缓存在内存中的,即使页面跳转或刷新,这些图片对象也不会被销毁,可以继续用于之后的渲染过程。

2. 表单验证

在一个表单中可能有多个输入框,每个输入框都需要进行验证。我们可以使用一个验证器的工厂来创建验证器对象,并将验证规则作为外部参数传入。这样可以避免重复创建相同规则的验证器对象。

 
// 表单验证器工厂
const validatorFactory = (function() {const validatorCache = {};return {createValidator: function(rule) {if (validatorCache[rule]) {return validatorCache[rule];} else {const validator = {validate: function(value) {// 根据规则进行验证}};validatorCache[rule] = validator;return validator;}}};
})();// 使用表单验证器工厂创建验证器对象
const emailValidator = validatorFactory.createValidator('email');
const phoneValidator = validatorFactory.createValidator('phone');

  1. 首先,通过自执行函数创建了一个封闭的工厂函数 validatorFactory,这个函数返回一个对象,包含了 createValidator 这个方法。
  2. 在这个工厂函数内部,创建了一个名为 validatorCache 的对象,用于缓存已经创建过的验证器对象。
  3. createValidator 方法接收一个规则参数,然后根据这个规则创建一个新的验证器对象。如果 validatorCache 中已经存在该规则的验证器对象,就直接返回缓存的版本,否则就创建一个新的验证器对象并将其缓存。
  4. 在创建验证器对象时,定义了一个 validate 方法用于进行具体的验证操作。具体的验证逻辑需要根据具体的规则来实现。
  5. 最后,通过调用 validatorFactory.createValidator 方法,分别创建了两个验证器对象 emailValidator 和 phoneValidator

通过这种方式,当需要使用相同的规则进行验证时,可以直接从缓存中获取验证器对象,避免了重复的创建过程,提高了性能。

优缺点

优点
  1. 减少内存使用:享元模式通过共享相似对象来减少内存使用,特别适用于大量相似对象的场景。
  2. 提高性能:由于减少了对象的创建和销毁,享元模式可以提高系统的性能和响应速度。
  3. 简化代码逻辑:享元模式将对象的内部状态和外部状态分离,使得代码更加清晰和易于维护。
缺点
  1. 增加复杂性:享元模式引入了共享对象和工厂管理,增加了系统的复杂性。
  2. 共享状态的安全性:如果多个对象共享了相同的内部状态,那么一个对象对内部状态的修改可能会影响其他对象。

总结

享元模式是一种优化大量相似对象创建和管理的设计模式,在前端开发中可以用于优化图片懒加载、表单验证等场景。它通过共享相似对象来减少内存使用和提高性能,同时也简化了代码逻辑。然而,它也增加了系统的复杂性,并且需要注意共享状态的安全性。在实际应用中,我们需要根据具体场景权衡使用享元模式带来的优缺点。

相关文章:

【前端设计模式】之享元模式

享元模式是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。在前端开发中,享元模式可以用于优化大量相似对象的创建和管理,从而提高页面的加载速度和用户体验。 享元模式特性 共享对象:享元模式通过共享相似对象来…...

C++前缀和算法:合并石头的最低成本原理、源码及测试用例

本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 动态规划,日后完成。 题目 有 n 堆石头排成一排,第 i 堆中有 stones[i] 块石头。 每次 移动 需要将 连续的 k 堆石头合并为一堆,而…...

maven 安装本地jar失败 错误指南

Maven 安装本地 jar 失败 安装命令: mvn install:install-file -Dfile文件路径地址 -DgroupIdcom.allinpay.sdk -DartifactIdtop-sdk-java -Dversion1.0.5 -Dpackagingjar 错误描述 : Unknown lifecycle phase “.allinpay.sdk”. You must specify a valid lifecycle phase o…...

【Spring Boot 源码学习】HttpEncodingAutoConfiguration 详解

Spring Boot 源码学习系列 HttpEncodingAutoConfiguration 详解 引言往期内容主要内容1. CharacterEncodingFilter2. HttpEncodingAutoConfiguration2.1 加载自动配置组件2.2 过滤自动配置组件2.2.1 涉及注解2.2.2 characterEncodingFilter 方法2.2.3 localeCharsetMappingsCus…...

uni-app--》基于小程序开发的电商平台项目实战(七)完结篇

🏍️作者简介:大家好,我是亦世凡华、渴望知识储备自己的一名在校大学生 🛵个人主页:亦世凡华、 🛺系列专栏:uni-app 🚲座右铭:人生亦可燃烧,亦可腐败&#xf…...

手写banner切换方式

<template><!-- banner轮播切换 --><div class"banner-wrapper"><div class"banner-info"><ul class"box" ref"box"><li v-for"(item, index) in bannerList" :key"index">&…...

技术文档工具『Writerside』抢鲜体验

前言 2023 年 10 月 16 日&#xff0c;JetBrains 宣布以早期访问状态推出 Writerside&#xff0c;基于 IntelliJ 平台的 JetBrains IDE&#xff0c;开发人员可使用它编写、构建、测试和发布技术文档&#xff0c;可以作为 JetBrains IDE 中的插件使用&#xff0c;也可以作为独立…...

Centos磁盘爆满_openEuler系统磁盘爆满清理方法---Linux工作笔记060

磁盘爆满,监控部门就会报警,报警就要处理,但是程序员并不擅长做运维的工作,记录一下把...以后用到会方便: 使用df -h命令可以看到,对应的磁盘占用情况,这里我的/dev/mapper/openeuler-root这个目录 占用的磁盘比较多,到了百分之95了.. 往往就是这个跟目录,我这里/data目录是自…...

dubbo启动提示端口号已经被占用

本地dubbo项目启动提示&#xff1a; java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) at org.sp…...

LeetCode每日一题——2678. Number of Senior Citizens

文章目录 一、题目二、题解 一、题目 You are given a 0-indexed array of strings details. Each element of details provides information about a given passenger compressed into a string of length 15. The system is such that: The first ten characters consist o…...

按摩 推拿上门服务小程序源码 家政上门服务系统源码

按摩 推拿上门服务小程序源码 家政上门服务系统源码 上门服务系统是一款基于互联网和移动应用的高端家政服务预订平台&#xff0c;它集成了用户、服务员、客户三方的需求于一体&#xff0c;为广大市民提供方便、高效、安全、舒适的家居服务体验&#xff0c;让你在家当皇帝&…...

排列排序问题---2023 年华中科技大学程序设计竞赛新生赛

解析&#xff1a; 将序列分为多段&#xff0c;每段必须连续并且单调&#xff0c;输出段数-1即可 #include<bits/stdc.h> using namespace std; #define int long long const int N1e65; int n,a[N]; signed main(){scanf("%lld",&n);for(int i1;i<n;i)…...

数据恢复怎么做?记好这款堪比数据恢复专家的软件!

“我真的受够了数据总是莫名其妙丢失了&#xff01;但是我的电脑知识又很有限&#xff0c;文件丢失后我都不知道应该采取什么方法来进行恢复。谁能给我介绍一些方法呀&#xff1f;” 数据丢失是一场噩梦&#xff0c;无论是因为误删除、硬盘损坏、病毒攻击还是其他原因。然而&am…...

远程监控高并发高吞吐java进程

文章目录 背景工具jconsole和jvisualvm 压测实战以太坊Java程序监控1.使用jconsole监控2.使用jvisualvm监控 问题分析堆内存使用异常通过调整内存策略来应对&#xff1a; 交易虚增问题 背景 作为使用java技术栈的金融类公司&#xff0c;确保Java程序在生产环境中的稳定性和性能…...

MapperStruct实现类为空

​ 问题描述&#xff1a; MapperStruct生成的实现了为空 按照在MapperStruct官网Installation – MapStruct中的方法配置后&#xff0c;生成的实现了是空的&#xff0c;如下&#xff1a; Overridepublic DeployHistory toEntity(DeployHistoryDto arg0) {if ( arg0 null ) …...

【webpack】wabpack5 知识梳理

1、简单介绍 默认功能 可处理 js、json文件&#xff0c;处理 js 文件引入将其打包&#xff1b; 可处理字体、图片、音视频等静态资源&#xff08;webpack5有内置loader&#xff1a;asset&#xff09;&#xff1b; 将es6的import规范编译为浏览器可识别的commonjs规范&#xf…...

ThinkPHP 3.2 常用内置函数

ThinkPHP 3.2 内置函数CDM疑问&#xff1a; D与M方法的相同点与不同点IAR 内置函数 C C方法是用于获取或修改&#xff0c;系统配置参数 语法&#xff1a; 获取&#xff1a;C&#xff08;需要获得的配置参数Name&#xff09; $value C(config_name);设置&#xff1a;C&…...

STM32F4_USB读卡器(USB_Slave)/USB U盘(Host)

前言 STM32F4芯片自带了USB OTG FS&#xff08;FS&#xff0c;即全速&#xff0c;12Mbps&#xff09;和USB OTG HS&#xff0c;支持USB Host和USB Device。 1. USB简介 USB&#xff0c;是英文Universal Serial BUS&#xff08;通用串行总线&#xff09;的缩写&#xff0c;是一…...

【网络安全入门】学习网络安全必须知道的100 个网络基础知识

前言 先领取资料再阅读哦 【282G】网络安全&黑客技术零基础到进阶全套学习大礼包&#xff08;附面试题答案&#xff09;&#xff0c;免费分享&#xff01; 【282G】网络安全&黑客技术零基础到进阶全套学习大礼包&#xff08;附面试题答案&#xff09;&#xff0c;免…...

96核的AMD锐龙Threadripper PRO 7995WX性能如何?

AMD新推出的锐龙Threadripper 7000系列可以说是目前最快的工作站处理器&#xff0c;最顶级的锐龙Threadripper PRO 7995WX拥有96个Zen 4内核&#xff0c;共192线程&#xff0c;基础频率2.5GHz&#xff0c;加速频率5.15GHz&#xff0c;拥有384MB L3缓存和多达128条PCI-E 5.0通道…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...