[JS设计模式]Flyweight Pattern

Flyweight pattern

享元模式是一种结构化的设计模式,主要用于产生大量类似对象而内存又有限的场景。享元模式能节省内存。

假设一个国际化特大城市SZ;它有5个区,分别为nanshan、futian、luohu、baoan、longgang;每个区都有多个图书馆,每个图书馆都有大量的图书,每种书都会有多本,那么该城市要建一个图书管理系统显然需要非常大的内存资源。通常同一本书会有多本,本文中叫做多个副本,以便表述;例如,《遥远的救世主》这本书总共有100本,我们就说有100个副本。

一本书通常有多个属性,例如,书名、作者、ISBN、图例、所属图书馆、总数量、在馆数量等等。如果每一本书的每一个副本,我们都创建一个对象来进行管理,有些共有的属性所占用的内存是一种显而易见的浪费。那么,在这种场景下,使用享元模式就能极大的优化图书管理系统的内存。所有类似场景使用享元模式都能奏效,如、游戏等。

通过通俗的场景描述了享元模式的作用,接下来,在技术层面来看看要怎样实现。需要说明的是,该模式也可以用于其他设计语言,不限于JS。

首先,创建一个图书类Book

class Book {constructor(title, author, isbn) {this.title = title;this.author = author;this.isbn = isbn;}
}

如果不用享元模式,我们创建多个副本,简单粗暴可能会这么实现:

const book1 = new Book("遥远的救世主", "豆豆", "abc123");
const book2 = new Book("遥远的救世主", "豆豆", "abc123");
const book3 = new Book("遥远的救世主", "豆豆", "abc123");
const book4 = new Book("遥远的救世主", "豆豆", "abc123");

如果使用享元模式,一种实现方式如下:

const books = new Map();
const createBook = (title, author, isbn) => {const existingBook = books.has(isbn);if (existingBook) {return books.get(isbn);}const book = new Book(title, author, isbn);books.set(isbn, book);return book;
};

可以通过ISBN来判断某种图书的唯一性,通过createBook来创建某一种图书。其他的副本我们可以通过addBook来实现:

const bookList = [];const addBook = (title, author, isbn, region) => {const book = {...createBook(title, author, isbn),region};bookList.push(book);return book;
};addBook("遥远的救世主", "豆豆", "AB123", "nanshan");
addBook("遥远的救世主", "豆豆", "AB123", "longgang");
addBook("埃隆·马斯克传", "沃尔特·艾萨克森", "CD123", "nanshan");
addBook("埃隆·马斯克传", "沃尔特·艾萨克森", "CD123", "futian");
addBook("长安的荔枝", "马伯庸", "EF123", "bao'an");console.log("图书总数:", bookList.length);
console.log("图书种类数:", books.size);

运行结果:

请添加图片描述

本文通过通俗的自然语言和实际的代码示例,描述了flyweight pattern的原理和使用场景。可在示例的基础上结合实际场景进行扩展,来完成更复杂的程序设计。

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

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

相关文章

代码随想录刷题题Day20

刷题的第二十天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C Day20 任务 ● 理论基础 ● 77. 组合 1 回溯算法理论基础 1.1 回溯法 回溯法是一种搜索的方式,是递归的副产品&#x…

海外媒体发稿:雅虎全球发稿推广脱颖而出的10种方法-华媒舍

雅虎全球发稿是一项重要的推广手段,能够帮助企业和个人提升品牌知名度和曝光率。在众多的发稿中脱颖而出并不容易。本文将为您介绍10种让您的雅虎全球发稿在众多文章中脱颖而出的方法,帮助您取得更好的效果。 1. 深入研究目标受众 在撰写雅虎全球发稿前…

Python to_numeric函数参数解读与最佳实践!

更多资料获取 📚 个人网站:ipengtao.com Python中的to_numeric函数是pandas库提供的一个强大而灵活的工具,用于将数据转换为数字类型。本文将深入探讨to_numeric函数的各种参数和用法,通过丰富的示例代码帮助大家更全面地理解和运…

基于thinkphp+vue的大学生校园生活服务平台sb00r

大学生一体化服务平台可以提高大学生综合服务信息管理问题的解决效率,优化大学生综合服务信息处理流程,保证大学生综合服务信息数据的安全,它是一个非常可靠,非常安全的应用程序。 运行环境:phpstudy/wamp/xammp等 开发语言&#…

CAS机制

Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇文章就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使…

鸿蒙应用开发初体验 HelloWorld

9 月 25 日,华为常务董事、终端 BG CEO、智能汽车解决方案 BU 董事长余承东华为秋季全场景新品发布会上介绍了鸿蒙系统的最新进展:HarmonyOS 4 发布后,短短一个多月升级用户已经超过 6000 万,成为史上升级速度最快的 HarmonyOS 版…

硬件工程师桥——互动篇笔记

知识体系 无论是做硬件还是软件,都最好看看基础篇,软件到了一定程度,如果硬件懂一些才会走的更远基础篇的电路不建议在实际中使用基础篇建议从头到尾都看,前后都有关联提高篇讲EMC和高速电路的东西,属于硬件工程师进阶…

python异常之try/else分句

1 python异常之try/else分句 如果try语句代码块未发生异常,则执行else语句代码块,else需要放在except分句后面。 1.1 基本用法 用法 try:# try语句代码块# 执行时可能发生异常的代码块 except ExceptionType:# except语句代码块# 当发生指定类型的异…

利用淘宝获得商品详情 API:提升电商平台的用户体验

一、引言 随着电子商务的快速发展,电商平台之间的竞争日益激烈。为了在竞争中脱颖而出,电商平台需要不断提升用户体验,提高用户满意度和忠诚度。淘宝获得商品详情 API 的出现,为电商平台提供了一个重要的工具,可以帮助…

WebGL开发三维解剖学应用

开发基于 WebGL 的三维解剖学应用通常涉及以下步骤。这些步骤包括创建三维模型、整合交互性、优化性能等,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.三维模型创建: 首先&#xff0…

智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白冠鸡算法4.实验参数设定5.算法结果6.参考文…

vue proxy代理 和 Nginx 配置跨域

vue.config.js文件中配置的代理: devServer: {port: 9095,// open: true, // 配置项目在启动时自动在浏览器打开proxy: {/yh: { // /api是代理标识,一般是每个接口前的相同部分target: "http://192.168.5.58:8002", // 请求地址,一…

4.3【共享源】克隆实战开发之截屏(一)

一,Screen截屏介绍 Screen的截屏是指从源读取像素,然后复制到缓冲区。然后可以根据需要操纵缓冲区;它可以简单地写入文件,也可以在其他窗口或显示器中使用。 Screen API从源中读取像素,并将其复制到提供的缓冲区中以捕获截屏。缓冲区可以是pixmap或窗口缓冲区,但必须设…

众和策略:美股全线上涨 中概股大涨

当地时间12月21日,欧洲股市全线下跌,英国富时100指数、法国CAC40指数、德国DAX指数均小幅下跌。美国通胀降温,美股商场三大指数尾盘飙升,纳斯达克指数、标普500指数均涨逾1%,大型科技股多数上涨,特斯拉涨近…

机器人运动速度与接触力

当机器人以较快的速度移动时,其与周围环境的接触力可能会增加。这是因为机器人快速移动时,其与环境的相互作用时间较短,导致接触力的瞬间增大。 然而,具体的接触力大小还受到其他因素的影响,如机器人的负载、环境条件…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

前段时间忙于接口测试,也看了几款接口测试工具,简单从几个角度做了个比较,拿出来与诸位分享一下。本文从多个方面对接口测试的三款常用工具进行比较分析,以便于在特定的情况下选择最合适的工具,或者使用自己编写的工具…

4_js函数的进阶与常用对象的使用

day04_js函数的进阶与常用对象的使用 1. 作用域 作用域:指的就是变量的有效范围 2. 什么是作用域链 作用域链:在访问变量的时候是按照就近原则 3. 简单的理解类和对象 3.1 对象的相关概念 从用户登录的角度理解为什么需要对象 我们为什么要使用对…

React + valtio 响应式状态管理

Valtio 是一个很轻量级的响应式状态管理库。valtio 让数据管理在 React 和原生 JS (Vanilla) 中变得更加简单的一个库,它类似于 Vue 的数据驱动视图的理念,使用外部状态代理去驱动 React 视图来更新。 一、状态管理库 dispatch 流派(单向数据流-中心化管…

Flink 运行时[Runtime] 整体架构

一、基本组件栈 在Flink整个软件架构体系中,同样遵循着分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。从下图中可以看出整个Flink的架构体系基本上可以分为三层,由上往下依次是 …

MT6739/MTK6739安卓核心板规格参数_MTK平台核心板定制

安卓核心板采用联发科 MT6739 平台开发设计,搭载开放的智能 Android 操作系统。它集成 GPU PowerVR GE8100 570MHz,集成了 BASEBAND、UMCP、PMU 等核心器件,支持 2.4G5G 双频 WIFI(可支持 1*1 MIMO)、BLUETOOTH 近距离无线传输技术&#xff0…