Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >享元模式

享元模式

原创
作者头像
WindRunnerMax
修改于 2020-10-27 02:25:22
修改于 2020-10-27 02:25:22
3490
举报
文章被收录于专栏:Czy‘s BlogCzy‘s Blog

享元模式

享元模式Flyweight Pattern主要用于减少创建对象的数量,以减少内存占用和提高性能,其提供了减少对象数量从而改善应用所需的对象结构的方式,享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。享元模式运用共享技术有效地支持大量细粒度对象的复用,系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用,由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻量级模式,其是一种对象结构型模式。

描述

面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数,当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正是为解决这一类问题而诞生的,享元模式通过共享技术实现相同或相似对象的重用。在享元模式中可以共享的相同内容称为内部状态IntrinsicState,而那些需要外部环境来设置的不能共享的内容称为外部状态Extrinsic State,由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池Flyweight Pool用于存储具有相同内部状态的享元对象。在享元模式中共享的是享元对象的内部状态,外部状态需要通过环境来设置。在实际使用中,能够共享的内部状态是有限的,因此享元对象一般都设计为较小的对象,它所包含的内部状态较少,这种对象也称为细粒度对象,享元模式的目的就是使用共享技术来实现大量细粒度对象的复用。

模式结构

  • Flyweight: 抽象享元类。
  • ConcreteFlyweight: 具体享元类。
  • UnsharedConcreteFlyweight: 非共享具体享元类。
  • FlyweightFactory: 享元工厂类。

优点

  • 享元模式的优点在于它可以极大减少内存中对象的数量,使得相同对象或相似对象在内存中只保存一份。
  • 享元模式的外部状态相对独立,而且不会影响其内部状态,从而使得享元对象可以在不同的环境中被共享。

缺点

  • 享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
  • 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。

适用环境

  • 一个系统有大量相同或者相似的对象,由于这类对象的大量使用,造成内存的大量耗费。
  • 对象的大部分状态都可以外部化,可以将这些外部状态传入对象中。
  • 使用享元模式需要维护一个存储享元对象的享元池,而这需要耗费资源,因此应当在多次重复使用享元对象时才值得使用享元模式。

实现

代码语言:txt
AI代码解释
复制
class Tea { // 茶产品类 实例为被共用的对象
    constructor(preference){
        this.preference = preference;
    }
}

class TeaMaker { // 作为茶工厂以创建茶的实例 即享元工厂来负责维护一个享元池
    constructor(){
        this.availableTea = {};
    }

    make(preference) {
        this.availableTea[preference] = this.availableTea[preference] || (new Tea());
        return this.availableTea[preference];
    }
}

(function TeaShop(){
    const shop = new TeaMaker();
    var lessSugar1 = shop.make("less sugar");
    var moreMilk1 = shop.make("more milk");
    var withoutSugar1 = shop.make("without sugar");
    var lessSugar2 = shop.make("less sugar");
    var moreMilk2 = shop.make("more milk");
    var withoutSugar3 = shop.make("without sugar");
    console.log(lessSugar1 === lessSugar2); // true
    console.log(moreMilk1 === moreMilk2); // true
    console.log(withoutSugar1 === withoutSugar3); // true
})();

每日一题

代码语言:txt
AI代码解释
复制
https://github.com/WindrunnerMax/EveryDay

参考

代码语言:txt
AI代码解释
复制
https://www.runoob.com/design-pattern/flyweight-pattern.html
https://github.com/sohamkamani/javascript-design-patterns-for-humans#-flyweight
https://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/flyweight.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式(十):享元模式
设计模式(十):享元模式
Java架构师必看
2021/04/13
3390
享元模式浅析
面向对象技术可以很好地解决一些灵活性或可以扩展性问题,但是很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致对象创建以及垃圾回收的代价过高,造成性能下降等问题。
孟君
2020/07/14
4010
Java设计模式(十一)享元模式
转载于:https://blog.csdn.net/justloveyou_/article/details/55045638
每天学Java
2020/06/01
9330
Java设计模式(十一)享元模式
设计模式---享元模式
面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式通过共享技术实现相同或相似对象的重用提高系统资源的利用率。
大忽悠爱学习
2021/11/15
2490
【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量
在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)用于存储具有相同内部状态的享元对象。
蛮三刀酱
2020/02/14
6520
【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量
这就是享元模式!
内部状态(Intrinsic State):存储在享元对象内部并且不会随环境改变而改变的状态,内部状态可以共享(例如:字符的内容)
千羽
2021/12/29
5960
这就是享元模式!
C++设计模式——Flyweight享元模式
享元模式是一种结构型设计模式,它将每个对象中各自保存一份数据的方式改为多个对象共享同一份数据,该模式可以有效减少应用程序的内存占用。
Coder-ZZ
2024/06/18
940
C++设计模式——Flyweight享元模式
设计模式-享元模式
享元模式从字面上翻译是“蝇量级模式”,其实并不太好理解。这个模式的作用就是在一个系统当中有很多很多的对象,而这些对象很相似,有细微地方不同,单数数量太大,影响系统性能,为了避免系统中出现大量相同或相似的对象,同时又不影响客户端程序通过面向对象的方式对这些对象进行操作,享元模式横空出世。
breezedancer
2018/09/12
3250
设计模式-享元模式
通俗易懂设计模式解析——享元模式
  今天我们继续讲述设计模式,今天提及的是享元模式,享——共享。之前不是出现了一系列共享的东西吗?为啥呀,还不就是有些东西每个人都需要,但是每个人都去买一个又有点浪费。所以出现共享。话费一定的经济可以使用,使用完成之后又归还。这就是享。分享共享。今天讲的享元模式跟这相类似。享元模式——通俗来说也就是共享最小单元的一种模式。我们就一起看看到底啥是这享元模式吧。
小世界的野孩子
2019/09/29
1.1K0
通俗易懂设计模式解析——享元模式
享元模式--大量的飞龙
有一个场景是玩家冲进了怪物的老巢,里面有成百上千的飞龙,成群的飞龙向玩家冲过来,这时候游戏画面就会出现卡顿,体验非常不好。领导让小帅优化一下这个场景,让游戏体验变的丝滑如水。
zhanyd
2022/05/16
1840
享元模式--大量的飞龙
设计模式——享元模式
设计模式——享元模式
Java架构师必看
2021/05/14
2920
设计模式——享元模式
【Java设计模式】016-享元模式
享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
訾博ZiBo
2025/01/06
760
设计模式学习笔记(十二)享元模式及其在String、Java 包装类中的应用
享元(Flyweight)模式:顾名思义就是被共享的单元。意图是复用对象,节省内存,提升系统的访问效率。比如在红白机冒险岛游戏中的背景花、草、树木等对象,实际上是可以多次被不同场景所复用共享,也是为什么以前的游戏占用那么小的内存,却让我们感觉地图很大的原因。
归思君
2023/10/16
3150
设计模式学习笔记(十二)享元模式及其在String、Java 包装类中的应用
23种设计模式之享元模式
上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态
烟草的香味
2019/07/25
3910
享元模式
享元模式定义 英文定义:A flyweight is an object that minimizes memory use by sharing as much data as possible with other similar objects 中文定义:享元模式运用共享技术有效地支持大量细粒度的对象。 享元模式UML图(来自Google图片)
卡尔曼和玻尔兹曼谁曼
2019/01/22
3800
享元模式
设计模式之享元模式
在设计一个程序的时候,有时候我们会遇到构建大量重复实例的问题,比如一个五子棋游戏,每一个棋子都是一个对象,它们占据了很大的资源,但是这些对象实际上内部的差别很小,这种情况就催生了享元模式的形成。
宿春磊Charles
2022/03/29
2370
设计模式之享元模式
【设计模式】享元模式 实现 ( 实现流程 | 抽象享元类 | 具体享元类 | 享元工厂 | 用户调用 | 代码模板 )
1 . 定义抽象享元类 : 定义抽象类 , 内部状态 , 外部状态 , 抽象方法 ;
韩曙亮
2023/03/27
1970
2022-10-10-享元模式
解释器模式第一遍没有读懂,看到后面说实际项目中很少用到,因为它会引起效率、性能以及维护等问题,会直接用已有的成熟的工具。
三流之路
2022/10/25
1630
Java 设计模式系列(14) —— 享元模式
享元模式是以共享的方式高效的支持大量的细粒度的对象,而享元模式能做到共享的关键是区分内部状态和外部状态。
求和小熊猫
2021/01/18
3030
设计模式-享元模式
夏天降温,各家各户使用降温神器各不一样,有的用风扇,有的用冷风扇,有的用空调,牛逼的直接有中央空调(有钱,真有钱~),重点是要用,如果没有想用那装一个,下次直用就就OK了,而一般一个房间装一台就OK,不用重复装多台(你家里有钱除外),每次就直接使用,享元模式就是解决这种重复。
逍遥壮士
2020/09/18
3440
设计模式-享元模式
相关推荐
设计模式(十):享元模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档