iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Flyweight享元模式怎么实现
  • 909
分享到

Flyweight享元模式怎么实现

2024-04-02 19:04:59 909人浏览 独家记忆
摘要

今天小编给大家分享一下Flyweight享元模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来

今天小编给大家分享一下Flyweight享元模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

Flyweight(享元模式)

Flyweight(享元模式)属于结构型模式,是一种共享对象的设计模式

意图:运用共享技术有效地支持大量细粒度的对象。

举例子

如果看不懂上面的意图介绍,没有关系,设计模式需要在日常工作里用起来,结合例子可以加深你的理解,下面我准备了三个例子,让你体会什么场景下会用到这种设计模式。

富文本编辑器的字母对象

富文本编辑器在英文环境下,其中的文本由大量字母组成,为了便于做统一的格式化、计算等处理,需要将每个字母都存储为对象,但这样存储的代价太大了。

已知英文字母一共 26 个,所以文档中存在大量重复使用的字母,而每个字母除了位置信息外,其它信息都是相同且只读的,那么有办法降低富文本场景巨大的字母对象数量吗?

网盘存储

当我们上传一部电影时,有时候几十 GB 的内容不到一秒就上传完了,这是网盘提示你,“已采用极速技术秒传”,你会不会心生疑惑,这么厉害的技术为什么不能每次都生效?

另外,网盘存储时,同一部电影可能都会存放在不同用户的不同文件夹中,而且电影文件又特别巨大,和富文本类似,电影文件也只有存放位置是不同的,而其余内容都特别巨大且只读,有什么办法能优化存储呢?

大型多人游戏

玩多人游戏时,为了防止外挂,一般对象的创建与计算是在服务器完成的,那如何保证一个玩家拾取物品后,另一个玩家看到的物品会消失?

其实道理已经不言而喻了,虽然在不同客户端之间,游戏对象是相互独立的,但在一局游戏中,所有玩家的对象在服务器是共享的。

意图解释

“共享” 就是享元模式的精髓,将那些大量的,具有很多内部状态而外部状态很少的对象进行共享,就是享元模式的使用方式。

意图:运用共享技术有效地支持大量细粒度的对象。

共享技术可以理解为缓存,当一个对象创建后,再次访问相同对象时,就不再创建新的对象了,而只有在访问没有被缓存过的对象时,才创建新对象,并立即缓存起来。

这样做可以有效支持大量细粒度的对象,在富文本例子中,无数的字母就是大量细粒度对象,在网盘存储中,电影文件就是大量细粒度对象,在大型多人游戏中,每局游戏内存在大量细粒度对象。

这些细粒度对象都拥有相同的特征:

量特别大,这个很容易理解。

具有大量内部状态,且不随着客户端的不同而改变。

富文本的字母,不因为展示到不同语句中而发生变化,变化的只有状态;电影文件,不因为放在不同用户的文件夹中而对电影内容产生变化,变化的只有属于哪些用户,放在哪些文件夹里;多人游戏中,同一把武器对象,不因为有多个人的电脑独立运行而拥有更多的弹药,变化的只有在哪些客户端被访问。

具有少量外部状态,甚至没有外部状态。在上面已经解释了,字母的位置、电影的位置、游戏对象的客户端都是外部状态,这些外部状态相比于其内部状态来说,大小微乎其微,且方便分离存储。

遇到这种情况,我们就可以将对象内部状态共享,外部状态独立存储,从而节省大量空间。

尤其是对于网盘的场景,承诺给用户 2 TB 的存储空间,这个用户看到其他人分享了 100 个电影,就点击 “下载到我的网盘”,此时虽然占用了自己 1 TB 的网盘空间,但实际上网盘运营商并没有增加 1 TB 的存储空间,实际可能增加了 1kb 的存储空间,记录了存储位置,这就是网盘鸡贼的地方,并不占用空间的内容,却占用了用户真金白银购买的存储空间。

当然,这就是享元模式的价值,对网盘公司来说,价值巨大,对用户来说,没有价值。所以享元模式的价值体现在全局,比如对整个富文本编辑器来说,减少了巨量字母对象数量,但对于每一个字母对象而言,并没有任何优化。

结构图

对于 Client 而言,下图描述了如何共享 Flyweight:

Flyweight: 共享接口,通过这个接口可以操作对象的外部状态。

ConcreteFlyweight: 实现 Flyweight 接口的对象,这个对象是可被共享的。

UnsharedConcreteFlyweight: 不被共享的对象,因为在享元模式中,实际上并不是所有对象都可以被共享。

FlyweightFactory: 创建并管理 Flyweight 对象,通过其返回的 Flyweight 对象,如果已创建,则会返回之前创建的那个,没有的话才会创建一个新的。

Client: 使用 Flyweight 的客户端。

通过第二个图可以明显看到,两个不同的 Client 持有了相同 aConcreteFlyweight 引用。

代码例子

下面例子使用 typescript 编写。

class FlyweightFactory {

  public getFlyWeight(key) {

    if (this.flyweight[key]) {

      return this.flyweight[key]

    }

    const flyweight = new Flyweight()

    this.flyweight[key] = flyweight

    return flyweight

  }

}

FlyweightFactory 提供的 getFlyWeight 方法,实际上是按照 key 对 flyweight 实例进行缓存,相同 key 下只存储一个 flyweight 实例。

弊端

如果细粒度对象不多,则没必要使用享元模式。

另外,就算细粒度对象很多,如果对象内部状态并不多,主要都是外部状态,那么享元模式就起不到什么作用了,因为享元模式通过共享对象,只能节省内部状态,而不能节省外部状态。

另外,如果享元模式映射到的共享对象数量并没有比原始对象少出数量级关系,使用的意义也不大。比如富文本编辑器的例子,对于英文来说,一共就 26 个字母,那么 1 万字的文章优化比例是 10000:26,但对于中文文章而言,文字实例本身就很多,可能 1 万字的文章中,汉字去重后依然有 3000 个,那么优化比例就是 10000:3000,此时享元模式的意义就没那么打了。

以上就是“Flyweight享元模式怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网JavaScript频道。

--结束END--

本文标题: Flyweight享元模式怎么实现

本文链接: https://www.lsjlt.com/news/96461.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Flyweight享元模式怎么实现
    今天小编给大家分享一下Flyweight享元模式怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2024-04-02
  • .Net结构型设计模式之享元模式(Flyweight)
    目录一、动机(Motivate)二、意图(Intent)三、结构图(Structure)四、模式的组成五、享元模式的具体代码实现六、享元模式的实现要点:1、享元模式的优点2、享元模式...
    99+
    2024-04-02
  • java享元模式怎么实现
    在Java中,享元模式可以通过以下步骤来实现: 定义共享对象的接口(享元接口):这个接口定义了共享对象的操作方法。 public...
    99+
    2023-10-23
    java
  • javascript设计模式的享元模式怎么实现
    这篇文章主要介绍“javascript设计模式的享元模式怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript设计模式的享元模式怎么实现”文章能帮助大家解决问题。一. 认识享元模...
    99+
    2023-06-26
  • PHP结构型模式之享元模式怎么实现
    这篇文章主要讲解了“PHP结构型模式之享元模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP结构型模式之享元模式怎么实现”吧!享元模式(Flyweight Pattern)是什...
    99+
    2023-07-05
  • .Net结构型设计模式之享元模式怎么实现
    这篇文章主要介绍了.Net结构型设计模式之享元模式怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇.Net结构型设计模式之享元模式怎么实现文章都会有所收获,下面我们一起来看看吧。一、动机(Motivate...
    99+
    2023-06-30
  • javascript设计模式之享元模式
    目录一. 认识享元模式二. 代码具体实现1. 不使用享元模式实现上述案例2. 使用享元模式重构上述代码3. 享元模式的状态三. 享元模式实际应用扩展:再谈内部状态和外部状态四. 对象...
    99+
    2024-04-02
  • Java设计模式之享元模式
    本文通过优化买票的重复流程来说明享元模式,为了加深对该模式的理解,会以String和基本数据类型的包装类对该模式的设计进一步说明。 读者可以拉取完整代码到本地进行学习,实现代码均测试...
    99+
    2024-04-02
  • C++享元模式详解
    目录未引入享元模式引入享元模式总结未引入享元模式 #include <iostream> #include <list> #include <map...
    99+
    2024-04-02
  • PHP中的享元模式是什么
    本篇内容介绍了“PHP中的享元模式是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!享元模式,“享元”这两个字在中文里其实并没有什么特殊的...
    99+
    2023-06-20
  • 好程序员分享java设计模式之享元模式
      好程序员分享java设计模式之享元模式,享元模式有点类似于单例模式,都是只生成一个对象被共享使用。享元模式主要目的就是让多个对象实现共享,减少不必要的内存消耗,将多对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低...
    99+
    2023-06-02
  • Python设计模式结构型享元模式
    目录一、享元模式二、应用场景三、代码示例一、享元模式 享元,可理解为 Python 中的元类、最小粒度的类,系统中存在大量的相似对象时,可以选择享元模式提高资源利用率。 享元具有两种...
    99+
    2024-04-02
  • JavaScript设计模式之性能优化模式享元模式
    目录前言案例享元设计模式的状态前言 享元设计模式是用于性能优化的模式,这种设计模式的核心在于可以共享技术并支持对大量细分过后的对象进行调整,如果系统    中因为...
    99+
    2024-04-02
  • 每天一个设计模式之享元模式
    作者按:《每天一个设计模式》旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现。诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) 个人技术博客-godbmw.com 欢迎来玩! ...
    99+
    2023-01-31
    模式
  • PHP结构型模式之享元模式详解
    目录享元模式(Flyweight Pattern)是什么享元模式的优点享元模式的实现享元模式的使用总结享元模式(Flyweight Pattern)是什么 享元模式是一种结构型模式,...
    99+
    2023-05-15
    PHP享元模式 PHP结构型模式
  • Java享元模式示例分析
    这篇文章主要介绍了Java享元模式示例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java享元模式示例分析文章都会有所收获,下面我们一起来看看吧。定义享元模式(FlyWeight Pattern),也叫蝇...
    99+
    2023-06-29
  • java享元模式有哪些类
    本篇内容主要讲解“java享元模式有哪些类”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java享元模式有哪些类”吧!一、关于享元模式  享元模式有点类似于单例模式,都是只生成一个对象被共享使用...
    99+
    2023-06-02
  • Java设计模式之享元模式示例详解
    目录定义原理类图案例需求方案:享元模式分析总结定义 享元模式(FlyWeight Pattern),也叫蝇量模式,运用共享技术,有效的支持大量细粒度的对象,享元模式就是池技术的重要实...
    99+
    2024-04-02
  • 深入理解Java设计模式之享元模式
    目录一、引言二、什么是享元模式三、享元模式的结构四、享元模式和单例模式的异同五、享元模式的优缺点六、享元模式的使用场景七、享元模式的实现八、总结一、引言 大家都知道单例模式,通过一个...
    99+
    2024-04-02
  • 如何理解Java设计模式的享元模式
    本篇内容介绍了“如何理解Java设计模式的享元模式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、引言大家都知道单例模式,通过一个全局变量...
    99+
    2023-06-25
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作