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

news2024/10/2 12:23:43

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

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.coloradmin.cn/o/2184402.html

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

相关文章

Oracle 数据库安装及配置

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

PCL MLS上采样(基于法向量)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 可视化原始点云和上采样后的点云 2.1.2 MLS 上采样 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总&#xff0…

Redis-预热雪崩击穿穿透

预热雪崩穿透击穿 缓存预热 缓存雪崩 有这两种原因 redis key 永不过期or过期时间错开redis 缓存集群实现高可用 主从哨兵Redis Cluster开启redis持久化aof,rdb,尽快恢复集群 多缓存结合预防雪崩:本地缓存 ehcache redis 缓存服务降级&…

iPhone/iPad技巧:如何解锁锁定的 iPhone 或 iPad

“在我更新 iPhone 上的软件后,最近我遇到了iPhone 被锁定到所有者的消息,该如何解决?” 根据我们的研究,许多用户在 iOS 18 更新或恢复出厂设置后都会遇到同样的问题。只要出现问题,您就无法使用 iPhone 或 第 1 部分…

jenkins微服务

如果vim进去某个文件里,可以按键盘的向下键查阅其它部分 记得每天备份虚拟机的项目 一.在linux安装jenkins 1.上传文件 我们采用安装包的方式安装。 先用SShclient在/usr/local/下创建jenkins文件夹,然后向其中导入两个包 2.安装jenkins 再在控制…

「STL::queue」标准库适配器:priority_queue(优先队列)介绍|自定义比较运算(C++)

目录 概述 创建销毁 内部理解 构造析构 自定义比较 赋值重构 数据访问 内存管理 数据控制 Tips 概述 priority_queue 是一种C标准模板库STL中定义的一种序列容器,它允许你在运行时动态地进行堆操作。 priority_queue 可以自动管理内存,这意味…

使用阿里云试用资源快速部署web应用-dofaker为例

本文介绍使用阿里云的试用资源部署dofaker的方法,本教程主要作学习在阿里云部署web应用之用,部署好应用之后,可以在任何地点通过公网ip访问web应用。 一、创建云主机 登录阿里云账户之后,点击控制台: 点击云服务器EC…

基于SSM的大学生心理素质测评及咨询平台系统设计与实现(源码+定制+讲解)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

vscode中配置python虚拟环境

python虚拟环境作用 Python虚拟环境允许你为每个独立的项目创建一个隔离的环境,这样每个项目都可以拥有自己的一套Python安装包和依赖,不会互相影响。实际使用中,可以在vscode或pycharm中使用虚拟环境。 1.创建虚拟环境的方法: …

天呐!关于PyCharm你竟然一无所知?

PyCharm 是一种专为 Python 开发而设计的集成开发环境(IDE),由 JetBrains 开发。 以下是 PyCharm 的一些主要特点和常见的使用方法: 特点: 智能代码编辑:具有智能代码补全、语法检查、代码重构等功能&…

HISTCITE分析进阶

不可否认histcite是一个很好的文献分析的工具,他能很好的找到最重要的那几篇文章,同时也能找到研究的发文趋势、研究机构和著名的研究学者等。但是它是一个很老的软件,因而很多东西都没能跟上下载的分析。我在使用过程中,尝试做一些改变使其更好用,同时也做一些记录。 1.…

ROS学习笔记(三):VSCode集成开发环境快速安装,以及常用扩展插件配置

文章目录 前言VSCode集成开发环境1 安装VSCode2 VSCode扩展插件2.1 VSCode扩展插件模块介绍2.1 常用扩展插件配置一、语言支持类插件二、智能辅助类插件三、科学计算与数据分析类插件四、ROS开发相关插件 3 总结相关链接 前言 关于Ubuntu与ROS的常规安装,可以看这几…

数字经济与新质生产力:地理信息与遥感视角下的深度分析

在数字化浪潮的推动下,我们正见证着生产力的一次历史性飞跃。数字经济如何重塑生产力的三大要素:劳动对象、劳动资料和劳动者?让我们来深度分析数字经济如何推动新质生产力的发展。 一、数字经济与地理信息的融合 地理信息与遥感技术是数字…

如何在 Windows 10 上恢复未保存/删除的 Word 文档

您是否整夜都在处理重要的 word 文件,但忘记保存它?这篇文章是给你的。在这里,我们将解释如何恢复未保存的 word 文档。除此之外,您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生,每个人都了解丢失重要 W…

【Android 14源码分析】WMS-窗口显示-流程概览与应用端流程分析

忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…

资源《Arduino 扩展板1-LED灯》说明。

资源链接:Arduino 扩展板1-LED灯 1.文件明细: 2.文件内容说明 包含:AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程,采用AD做的。 该文件打板后配合Arduino使用,属于Arduino的扩展板。 该文件主要有…

Pytorch实现RNN实验

一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在…

计算机毕业设计Spark+PyTorch股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI

《SparkPyTorch股票预测系统》开题报告 一、研究背景与意义 随着信息技术的飞速发展和全球金融市场的日益繁荣,股票投资已成为广大投资者的重要选择之一。然而,股票市场的复杂性和不确定性使得投资者在做出投资决策时面临巨大的挑战。传统的股票分析方…

防sql注入的网站登录系统设计与实现

课程名称 网络安全 大作业名称 防sql注入的网站登录系统设计与实现 姓名 学号 班级 大 作 业 要 求 结合mysql数据库设计一个web登录页面密码需密文存放(可以采用hash方式,建议用sha1或md5加盐)采用服务器端的验证码&#…

今天推荐一个文档管理系统 Dorisoy.Pan

Dorisoy.Pan 是一个基于 .NET 8 和 WebAPI 构建的文档管理系统,它集成了 Autofac、MediatR、JWT、EF Core、MySQL 8.0 和 SQL Server 等技术,以实现一个简单、高性能、稳定且安全的解决方案。 这个系统支持多种客户端,包括网站、Android、iO…