前端开发设计模式——享元模式

一、享元模式的定义和特点

1.定义

        享元模式是一种结构型设计模式,旨在通过共享对象来减少内存使用并提高性能。在前端开发中,它用于处理大量细粒度对象的情况,将对象的状态划分为内部状态(可共享)和外部状态(不可共享)。

2.特点

        共享性:

                核心是对象的共享,多个对象可以共享相同的内部状态,从而减少对象的创建数量。例如,在创建多个具有相同样式但不同内容的按钮时,可以共享按钮的样式这一内部状态。

        内部状态与外部状态分离:

                内部状态是对象的固有属性,不随环境改变而改变,并且是可以被共享的部分。外部状态是对象依赖的、根据具体情况变化的属性,每个对象实例的外部状态是独立的。例如,对于多个相同类型的图标,图标的颜色、形状等是内部状态可共享,而图标的位置则是外部状态。

二、享元模式的实现方式

1.创建享元类型

        首先定义享元类,该类包含内部状态相关的属性和方法。

        示例:创建一个简单的文本框享元类

class TextBoxFlyweight {
    constructor(fontFamily, fontSize) {
        this.fontFamily = fontFamily;
        this.fontSize = fontSize;
    }
    render() {
        const textBox = document.createElement('input');
        textBox.type = 'text';
        textBox.style.fontFamily = this.fontFamily;
        textBox.style.fontSize = this.fontSize;
        return textBox;
    }
}

        这里fontFamily(字体)和fontSize(字号)是内部状态,render方法用于创建并返回一个具有特定字体和字号的文本框元素。

2.享元工厂类

        用于创建和管理享元对象。

        继续以上面的文本框为例,享元工厂类如下:

class TextBoxFlyweightFactory {
    constructor() {
        this.flyweights = {};
    }
    getFlyweight(fontFamily, fontSize) {
        const key = `${fontFamily}_${fontSize}`;
        if (!this.flyweights[key]) {
            this.flyweights[key] = new TextBoxFlyweight(fontFamily, fontSize);
        }
        return this.flyweights[key];
    }
}

        工厂类内部使用一个对象flyweights来存储已经创建的享元对象。getFlyweight方法根据传入的字体和字号生成一个唯一的键,若不存在对应的享元对象则创建一个新的,否则返回已有的享元对象。

3.使用享元对象并处理外部状态

        在实际应用中,获取享元对象并添加外部状态。

        示例:

const textBoxFactory = new TextBoxFlyweightFactory();

// 获取共享的文本框享元对象
const textBox1 = textBoxFactory.getFlyweight('Arial', '12px');
const textBox2 = textBoxFactory.getFlyweight('Arial', '12px');

// 处理外部状态,如文本框的值和位置
textBox1.value = 'Text 1';
textBox1.style.left = '10px';
textBox2.value = 'Text 2';
textBox2.style.left = '50px';

// 将文本框添加到文档中
document.body.appendChild(textBox1.render());
document.body.appendChild(textBox2.render());

        这里获取了两个共享相同字体和字号(内部状态)的文本框享元对象,然后分别为它们设置了不同的值(外部状态)和位置(外部状态),最后将它们添加到页面中。

三、享元模式的应用场景

1.用户界面组件创建

        在构建复杂的前端界面时,大量的 UI 组件可能具有相似的样式或结构。例如,一个大型表单中有许多相同类型的输入框(如都是文本输入框且样式相同),可以使用享元模式共享输入框的样式相关的内部状态,而每个输入框的具体内容(外部状态)则各自不同。

2.游戏开发中的图形对象

        在游戏中,存在大量重复的图形元素,如相同类型的敌人角色或游戏道具。这些图形元素的外观(如形状、颜色等内部状态)可以共享,而它们在游戏场景中的位置、生命值(外部状态)等可以不同。

3.数据可视化中的图形元素

        在数据可视化中,可能会有许多相同类型的图表元素,如柱状图中的柱子。柱子的形状、颜色等内部状态可以共享,而柱子代表的数据值(外部状态)则不同。

四、享元模式的优点

1.内存优化

        通过共享对象,减少了大量相似对象的创建,从而显著降低内存占用。这在前端开发中对于处理大量 UI 元素或游戏对象等场景非常重要,有助于避免因内存不足导致的性能问题。

2.性能提升

        创建对象是一个相对耗时的操作,享元模式减少了对象的创建数量,提高了应用程序的运行速度。同时,也减少了垃圾回收的压力,因为垃圾回收器需要处理的对象数量减少了。

五、享元模式的缺点

1.复杂性增加

        享元模式需要将对象的状态进行分离,分为内部状态和外部状态,并且需要创建享元工厂类来管理享元对象的创建和共享。这增加了代码的结构和逻辑的复杂性,使得代码的理解和维护成本提高。

2.外部状态及管理难度

        外部状态不能被共享,需要额外的机制来管理。在前端开发中,这可能涉及到在不同的组件或模块之间传递和更新外部状态,容易导致代码的耦合度增加,并且在处理外部状态的变化时可能会出现逻辑错误。

六、注意事项

1.正确的划分状态

        准确地将对象的状态划分为内部状态和外部状态是享元模式成功的关键。如果划分不当,可能导致共享对象无法有效实现或者外部状态管理过于复杂。

2.享元对象的生命周期管理

        需要注意享元对象的创建和销毁时机。在某些情况下,如果享元对象不再被使用,应该及时从享元工厂中移除,以释放内存资源。但同时也要避免过早地销毁可能还会被使用的享元对象。

3.外部状态的独立性

        确保外部状态的独立性,避免外部状态之间的相互干扰。例如,在处理多个共享相同享元对象的实例时,一个实例的外部状态的改变不应影响其他实例的外部状态。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

zabbix7.0创建自定义模板的案例详解(以监控httpd服务为例)

前言 服务端配置 链接: rocky9.2部署zabbix服务端的详细过程 环境 主机ip应用zabbix-server192.168.10.11zabbix本体zabbix-client192.168.10.12zabbix-agent zabbix-server(服务端已配置) 创建模板 模板组直接写一个新的,不用选择 通过名称查找模板&#xf…

详解CSS中的伪元素

4.3 伪元素 可以把样式应用到文档树中根本不存在的元素上。 ::first-line 文本中的第一行 ::first-letter 文本中的第一个字母 ::after 元素之后添加 ::before 元素之前 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8&q…

测试用例的举例

1. 基于测试公式设计测试用例 通过功能&#xff0c;性能&#xff0c;安全性&#xff0c;界面&#xff0c;安全性&#xff0c;易用&#xff0c;兼容对于一个水杯进行测试用例的设计&#xff1b; 对于一个软件的测试用例设计&#xff1a; 功能&#xff1a;软件本质上能够用来干什…

本科生已不够 AI公司雇佣各领域专家训练大模型

9月29日消息&#xff0c;人工智能模型的性能在很大程度上依赖于其训练数据的质量。传统方法通常是雇用大量低成本劳动力对图像、文本等数据进行标注&#xff0c;以满足模型训练的基本需求。然而&#xff0c;这种方式容易导致模型在理解和生成信息时出现“幻觉”现象&#xff0c…

【递归】11. leetcode 129 求根节点到叶节点数字之和

1 题目描述 题目链接&#xff1a; 求根节点到叶节点数字之和 2 解答思路 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系到具体函数体怎么写&#xff0c;是一个宏观…

追随 HarmonyOS NEXT,Solon v3.0 将在10月8日发布

Solon &#xff08;开放原子开源基金会&#xff0c;孵化项目&#xff09;原计划10月1日发布 v3.0 正式版。看到 HarmonyOS NEXT 将在 10月8日启用公测&#xff0c;现改为10月8日发布以示庆贺。另外&#xff0c;Solon 将在2025年启动“仓颉”版开发&#xff08;届时&#xff0c;…

数据仓库的建设——从数据到知识的桥梁

数据仓库的建设——从数据到知识的桥梁 前言数据仓库的建设 前言 企业每天都在产生海量的数据&#xff0c;这些数据就像无数散落的珍珠&#xff0c;看似杂乱无章&#xff0c;但每一颗都蕴含着潜在的价值。而数据仓库&#xff0c;就是那根将珍珠串起来的线&#xff0c;它能够把…

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法

WebSocket消息防丢ACK和心跳机制对信息安全性的作用及实现方法 在现代即时通讯&#xff08;IM&#xff09;系统和实时通信应用中&#xff0c;WebSocket作为一种高效的双向通信协议&#xff0c;得到了广泛应用。然而&#xff0c;在实际使用中&#xff0c;如何确保消息的可靠传输…

解决Windows远程桌面 “为安全考虑,已锁定该用户账户,原因是登录尝试或密码更改尝试过多,请稍后片刻再重试,或与系统管理员或技术支持联系“问题

根本原因就是当前主机被通过远程桌面输入了过多的错误密码&#xff0c;被系统锁定。这种情况多数是你的服务器远程桌面被人试图攻击了&#xff0c;不建议取消系统锁定策略。如果阿里云或者腾讯云主机&#xff0c;只需要在管理后台通过管理终端或者VNC登陆一次&#xff0c;锁定即…

哈希表(HashMap、HashSet)

文章目录 一、 什么是哈希表二、 哈希冲突2.1 为什么会出现冲突2.2 如何避免出现冲突2.3 出现冲突如何解决 三、模拟实现哈希桶/开散列&#xff08;整型数据&#xff09;3.1 结构3.2 插入元素3.3 获取元素 四、模拟实现哈希桶/开散列&#xff08;泛型&#xff09;4.1 结构4.2 插…

DC00025【含论文】基于协同过滤推荐算法springboot视频推荐管理系统

1、项目功能演示 DC00025【含文档】基于springboot短视频推荐管理系统协同过滤算法视频推荐系统javaweb开发程序设计vue 2、项目功能描述 短视频推荐系统分为用户和系统管理员两个角色 2.1 用户角色 1、用户登录、用户注册 2、视频中心&#xff1a;信息查看、视频收藏、点赞、…

1.1.4 计算机网络的分类

按分布范围分类&#xff1a; 广域网&#xff08;wan&#xff09; 城域网&#xff08;man&#xff09; 局域网&#xff08;lan&#xff09; 个域网&#xff08;pan&#xff09; 注意&#xff1a;如今局域网几乎采用“以太网技术实现”&#xff0c;因此“以太网”几乎成了“局域…

Python核心知识:pip使用方法大全

什么是 pip&#xff1f; pip 是 Python 的包管理工具&#xff0c;允许用户安装、升级和管理 Python 的第三方库和依赖。它极大地简化了开发过程&#xff0c;使开发者可以轻松地获取并安装所需的软件包。pip 已成为 Python 项目中最常见的包管理工具&#xff0c;并且自 Python …

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】

【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】 一、上篇回顾二、项目准备2.1 准备模板项目2.2 支持计时功能2.3 配置UART4引脚2.4 支持printf重定向到UART42.5 支持printf输出浮点数2.6 支持printf不带\r的换行2.7 支持ccache编译缓存 三、TFLM集成3.1 添加tfli…

Ceph RocksDB 深度调优

介绍 调优 Ceph 可能是一项艰巨的挑战。在 Ceph、RocksDB 和 Linux 内核之间&#xff0c;实际上有数以千计的选项可以进行调整以提高存储性能和效率。由于涉及的复杂性&#xff0c;比较优的配置通常分散在博客文章或邮件列表中&#xff0c;但是往往都没有说明这些设置的实际作…

C# 相等性检测方法差异分析(==,Equals,ReferenceEquals)

先给结论&#xff1a; 对于每种类型创建2个一样的数据&#xff0c;比较结果如下表所示&#xff1a; 数据类型EqualsReferenceEqualsint(值类型)√√引用类型引用类型&#xff08;带override&#xff09;以operator 实现为准以Equals覆写为准struct必须实现操作符√struct&…

Android 12系统源码_输入系统(三)输入事件的加工和分发

前言 上一篇文章我们具体分析了InputManagerService的构造方法和start方法&#xff0c;知道IMS的start方法经过层层调用&#xff0c;最终会触发Navite层InputDispatcher的start方法和InputReader的start方法。InputDispatcher的start方法会启动一个名为InputDispatcher的线程&…

基于深度学习的点云处理模型PointNet++学习记录

前面我们已经学习了Open3D&#xff0c;并掌握了其相关应用&#xff0c;但我们也发现对于一些点云分割任务&#xff0c;我们采用聚类等方法的效果似乎并不理想&#xff0c;这时&#xff0c;我们可以想到在深度学习领域是否有相关的算法呢&#xff0c;今天&#xff0c;我们便来学…

给Windows系统设置代理的操作方法

一、什么是代理 网络代理是一种特殊的网络服务&#xff0c;允许一个网络终端通过这个服务与另一个网络终端进行非直接的连接&#xff0c;而提供代理服务的电脑系统或其它类型的网络终端被称为代理服务器。 代理服务器是网络信息的中转站&#xff0c;代理服务器就像是一个很大的…

DBC差异比较工具DBCCompare_原理介绍(四)

DBC比对工具UI图片 DBC比对工具&#xff1a;功能详解与源码分析 在现代汽车开发和诊断过程中&#xff0c;DBC&#xff08;Database Container&#xff09;文件扮演着至关重要的角色。它们详细描述了CAN&#xff08;Controller Area Network&#xff09;网络中各消息和信号的详…