设计模式学习——享元模式

Unity3D设计模式学习之享元模式 前言 享元模式Flyweight 用来解决大量且重复对象的管理问题。当内存受限的时候,使用享元模式来解决 大部分对象共享的问题。 GOF享元模式的定义为 使用共享的方式,让一群大小规模对象能更有效地运行。 共享 共享指的是使用管理结构来设计信息的存储方式,让可以被共享的信息,只需要产生一份对象,而这个对象能够被引用到其他对象中。 我们把哪些对象只能读取而不能写入的共享部分称为“... 阅读详情



基本介绍

  1. 享元模式(Flyweight Pattern),也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象。
  2. 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个。
  3. 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。
  4. 享元模式经典的应用场景就是池技术了,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池技术的重要实现方式。

原理类图

在这里插入图片描述
说明(即模式的角色及职责)

  1. FlyWeight是抽象的享元角色,他是产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
  2. ConcreteFlyWeight是具体的享元角色,是具体的产品类,实现抽象角色定义相关业务。
  3. UnSharedConcreteFlyWeight是不可共享的角色,一般不会出现享元工厂。
  4. FlyWeightFactory 享元工厂类,用于构建一个池容器(集合),同时提供从池中获取对象方法

补充说明:内部状态和外部状态

  1. 享元模式提出了两个要求:细粒度和共享对象。这里就涉及到内部状态和外部状态了,即将对象的信息分为两个部分:内部状态和外部状态。
  2. 内部状态指对象共享出来的信息,存储在享元对象内部且不会随环境的改变而改变
  3. 外部状态指对象得以依赖的一个标记,是随环境改变而改变的、不可共享的状态。

类图实例

在这里插入图片描述


代码实例

享元角色

public abstract class WebSite {
    public abstract void use(User user);
}

ConcreteWebSite 是具体的享元角色

public class ConcreteWebSite extends WebSite {
    //共享的部分,内部状态
    private String type = "";

    public ConcreteWebSite(String type) {
        this.type = type;
    }
    @Override
    public void use(User user) {
        System.out.println("网站的发布形式为:" + type + "在使用者为" + user.getName());
    }
}

WebSiteFactory 享元工厂类

//网站工厂类,根据需要返回一个网站 
public class WebSiteFactory {

    //集合,充当池的作用
    private HashMap<String, ConcreteWebSite> pool = new HashMap<>();

    //根据网站的类型,返回一个网站,如果没有就创建一个网站,并放入到池中
    public WebSite getWebSiteCategory(String type) {
        if (!pool.containsKey(type)) {
            //就创建一个网站,并放入到池中
            pool.put(type, new ConcreteWebSite(type));
        }
        return (WebSite) pool.get(type);
    }

    public int getWebSiteCount() {
        return pool.size();
    } 
}

User :外部状态

public class User {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试用例

public class Client {
    public static void main(String[] args) {
        //创建一个工厂类
        WebSiteFactory factory = new WebSiteFactory();
        WebSite webSite1 = factory.getWebSiteCategory("新闻");
        User user1 = new User();
        user1.setName("tom");
        webSite1.use(user1);

        WebSite webSite2 = factory.getWebSiteCategory("博客");
        User user2 = new User();
        user2.setName("jim");
        webSite2.use(user2);

        System.exit(0);
    }
}

享元模式在JDK-Integer的应用源码分析

测试用例

public class FlyWeight {
    public static void main(String[] args) {
        Integer x = Integer.valueOf(127);
        Integer y = new Integer(127);
        Integer z = Integer.valueOf(129);
        Integer w = new Integer(127);
        System.out.println(x.equals(y));
        System.out.println(x == y);
        System.out.println(x == z);
        System.out.println(w == z);
        System.out.println(w == y);
    }
}

执行结果

true
false
true
false
false

点击Integer.valueOf()方法,查看源码
在这里插入图片描述
点击InegerCache.low,查看InegerCache中,low=-128,high=127,如果Integer.valueOf(x) x 在 -128 ~ 127 就是使用享元模式,如果不在这个范围内,则仍然new 一个新对象。
在这里插入图片描述
总结

  1. 在valueOf方法中,先判断值是否在IntegerCache中,如果不在,就创建新的Integer(new),否则,就直接从缓存池中返回
  2. valueof方法,就使用到享元模式
  3. 如果使用valueOf方法得到一个Integer实例,范围在-128 ~ 127 执行速度比 new 要快

享元模式的注意事项和细节

  1. 在享元模式这样理解,“享”就表示共享,“元”表示对象
  2. 系统有大量对象,这些对象消耗大量内存,并且对象的状态大部分可以外部化时,我们就可以考虑使用享元模式
  3. 用唯一标识码判断,如果在内存中有,则返回这个唯一标识码所标识的对象,用HashMap/HashTable存储
  4. 享元模式大大减少了对象的创建,降低了程序内存的占用,提高效率
  5. 享元模式提高了系统的复杂度。需要分离出内部状态和外部状态,而外部状态具有固化特性,不应该随着内部状态的改变而改变,这是我们使用享元模式需要注意的地方。
  6. 使用享元模式时,注意划分内部状态和外部状态,并且需要一个工厂类加以控制。
  7. 享元模式经典的应用场景是需要缓冲池的场景,比如String常量池、数据库连接池。
设计模式学习笔记--享元模式 一.简介 今天来学习一下享元模式,英文名字叫flyweight pattern,字面上看是轻量级的意思,还是感觉中文翻译比较好理解。所谓享元,就是共享相同部分的意思。当我们在设计一个游戏的时候,比如我们要在场景中绘制三个相同的人物模型,如果我们直接创建三个一样的人物模型对象并绘制,那么我们就需要每次都读入人物模型相关的网格信息+贴图材质信息,很明显,这些东西只要有一份就可以了,而唯一不同 阅读详情

相关推荐

Java设计模式之享元模式实例详解

主要介绍了Java设计模式之享元模式,结合实例形式详细分析了享元模式的概念、功能、定义及使用方法,需要的朋友可以参考下

设计模式第14讲——享元模式(Flyweight)

享元模式是一种结构型的设计模式。一、什么是享元模式 二、 角色组成 三、优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构5.1 Bike——抽象享元类(FlyWeight)5.2 具体享元类(ConcreteFlyWeight)5.3 BikeFactory——享元工厂(FlyWeightFactory)5.4 testFlyWeight 六、总结

让~学习~成为一种习惯(橡 皮 人の技术博客) 1万+

Java设计模式之共享模式/享元模式(Flyweight模式)介绍

主要介绍了Java设计模式之共享模式/享元模式(Flyweight模式)介绍,本文讲解了为什么使用共享模式/享元模式、如何使用共享模式/享元模式、Flyweight模式在XML等数据源中应用等内容,需要的朋友可以参考下

享元模式(Flyweight)

享元模式(Flyweight Pattern)是一种结构型设计模式,它主要解决的问题是创建大量相似对象时的内存开销问题。该模式通过共享具有相同状态的对象来减少内存使用量。享元模式的思想是:当需要创建一个新对象时,首先检查是否已经存在具有相同状态的对象。如果存在,则返回已经存在的对象,否则创建一个新的对象。因此,如果要创建多个具有相同状态的对象,可以重复使用相同的对象,从而减少内存开销。通过运用共享技术来有效地支持大量细粒度对象的复用。

qq_53868937的博客 4260

网格自适应_Comsol案例解析17:自适应网格的使用

本期导读自适应网格细化有许多优势,比如可以不用对网格进行全局加密,增加计算精度,又会降低求解自由度。本期仍然以气泡上升案例为例,在两相流模块中使用自适应网格。【打开案例模型】【修改网格】适当让气泡边界加密,注意,曲率因子越小,曲线上的网格越密【添加自适应网格】使用默认的参数即可,这里的误差指示器用的是水平集phi。可以根据具体求解模型选择适当的自变量作为误差指示器。【口诀】默认的一般是最...

weixin_28726871的博客 5682

告别降级CUDA!手把手教你为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly + vLLM推理环境

本文详细指导如何为RTX 50系显卡(5080/5090)配置专属的PyTorch Nightly和vLLM推理环境,特别针对CUDA 12.8的适配问题提供解决方案。从硬件准备到源码编译,再到模型部署与性能调优,手把手教你构建高效AI推理系统。

weixin_33724046的博客 409

【设计模式】——享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种对象结构型模式,它通过共享已经存在的对象来减少内存使用量和提高系统性能。享元模式特别适用于那些创建大量相似对象而导致内存消耗过大的场景。本文将详细介绍享元模式在C++中的实现和应用。

J^T的博客 2694

windows局域网文件夹共享

windows局域网共享文件夹,亲测,包括可能出现的一些问题解决

yml15180824993的博客 4万+

设计模式详解(十三)——享元模式

享元模式是一种用于优化性能的软件设计模式,它通过共享对象来减少内存中对象的数量,从而降低内存消耗并提高系统性能。享元模式将对象的状态分为内部状态和外部状态,其中一些具有相同内部状态的对象可以被多个对象共享,而不是为每个对象都创建新的实例;而外部状态是变化的,不能共享。虽然我们创建了多次小汽车,但它们相同颜色和相同发动机排量的共享同一个享元对象,因此创建相同相同颜色和相同发动机排量的汽车时,可以减少了内存占用。将一辆小汽车可以看做是一个享元对象,共享的部分是小汽车的基本属性,比如颜色,发动机排量等。

qq_44307209的博客 1968

IEEE Access 上岸指南,附含泪整理的 cover letter 、沟通邮件、终版文档等资料包

终于上岸了! 我是一个小硕,本科期间发表过两篇水文,奈何学校有更高的毕业要求,只能硬着头皮尝试一下 SCI。 想投 IEEE Access 的朋友都应该知道 小木虫论坛 对这个期刊的讨论,褒贬不一,有的人说是大水刊,有的人说有难度。 比如: @wow_: 不可否认,灌水期刊。只要之前中过一篇,再投基本没有不录用的!我们实验室其他老师说过一区除外的收费期刊都应该禁止灌水。 @pssp: 审稿人还...

kurryluo的博客 1万+

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

100天精通Python(可视化篇)——第109天:Pyecharts绘制各种常用地图(参数说明+代码实战)

努力让自己发光,对的人才能迎着光而来 8万+

设计模式-结构型模式-享元模式

享元模式 (flyweight pattern) 的原始定义是:摒弃了在每个对象中保存所有数据的方式,通过共享多个对象所共有的相同状态,从而让我们能在有限的内存容量中载入更多对象。从这个定义中你可以发现,享元模式要解决的核心问题就是节约内存空间,使用的办法是找出相似对象之间的共有特征,然后复用这些特征。所谓“享元”,顾名思义就是被共享的单元。比如: 一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间,我们可以使用享元模式解决这一类问题.

Lucky boy的博客 535

Allegro172版本多人协同在线设计操作指导

首先用户需要在同一个局域网下,并且Allegro172的版本必须一致,比如都是S082的版本。另外一个用户同样打开相同版本的172,选择Symphony Team design。Allegro升级到172版本,可以支持多人协同设计,并且实时同步,具体操作如下。协同模式下,不能直接保存文件,需要另存版本,注意时常保存文件,以免丢失数据。第一个用户打开PCB,选择Symphony Team design。等待一会出现如下窗口,表示已经共享成功了,并且记下IP地址。出现一个窗口,输出开共享用户的IP地址。

weixin_54787054的博客 4954

设计模式学习—享元模式(Flyweight Design Pattern)

设计模式之享元模式的学习

闲鱼的博客 519

学Simulink——基于Simulink的Buck-Boost变换器双闭环PI+抗饱和设计建模示例

本文详细介绍了基于Simulink的非反相Buck-Boost变换器双闭环控制设计方法。针对Buck-Boost变换器特有的右半平面零点(RHPZ)和控制挑战,提出了电压-电流双闭环PI控制架构,并集成抗积分饱和机制。通过Simulink建模,实现了主电路、电流内环PI、电压外环PI、PWM及占空比限幅等模块的搭建,验证了在输入电压跌落(20V→10V)和负载突变(2A→4A)等场景下的稳定性能。仿真结果表明,输出电压波动小于0.35V,恢复时间快于1ms,电感电流有效限幅。文章还讨论了工程实践要点和扩展方

xiaoheshang_123的博客 318

(考研湖科大教书匠计算机网络)第四章网络层-第三节3、4:划分子网的IPv4地址和无分类IP地址

子网掩码: 32比特的子网掩码可以表明分类IP地址的主机号部分被借用了几个比特作为子网号子网掩码使用连续的比特1来对应网络号和子网号子网掩码使用连续的比特0来对应主机号将划分子网的IPv4地址与其相应的子网掩码进行逻辑与运算就可得到IPv4地址所在子网的网络地址如下图。

快乐江湖的博客 1348

设计模式学习系列十:享元模式(Flyweight Pattern)

暂时第一次听说,应该用的不多,暂时不学习这个了。

学习记录 1040

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

认真学习设计模式之享元模式(Flyweight Pattern)

# 【1】概述 ## ① 介绍 **享元模式(Flyweight Pattern) 也叫蝇量模式-- 运用共享技术有效地支持大量细粒度的对象**。常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个。 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。 享元模式经典的应用场景就是池技术了

小小默:进无止境 1375

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

HeadFirst 设计模式学习笔记16--享元模式拾零

本文已搬家至【HeadFirst 设计模式学习笔记】15 享元模式拾零

gnuhpc的专栏 3900

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

尚硅谷设计模式学习(12)---[享元模式(Flyweight Pattern)]

尚硅谷传送门==>B站尚硅谷Java设计模式 ❤❤❤感谢尚硅谷❤❤❤ 最近开始计划学习一下设计模式了,加油!!! 目录情景引入享元模式 情景引入 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希 望做这样的产品展示网站,但是要求都有些不同: 有客户要求以新闻的形式发布 有客户人要求以博客的形式发布 有客户希望以微信公众号的形式发布 传统思路分析 按照传统思路,直接使用客户A的网站项目进行拷贝使用; 但是这些网站的基本结构大体相同,相当于是创建了多个实例对

从零开始的异世界JAVA学习 692

设计模式学习--15.享元模式(Flyweight Pattern)

package com.designepattern.flyweightpattern; /** * @Date:2020/12/2 * @Content: */ import java.util.HashMap; /*** * 享元模式 * */ public class MainDemo { public static void main(String[] args) { FlyWeightFactory ff=new FlyWeight...

u010031813的博客 176

学习笔记【23种设计模式-第十一节:Flyweight Pattern 享元模式】

Flyweight Pattern 享元模式 简述: 享元模式也叫蝇量模式:运用共享技术有效的支持大量粒子度的对象。 常用于系统底层的开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中由我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个。 享元模式能够解决重复对象的内存浪费问题,当系统中有大量相似的对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。 享元模式经典的应用场景就是池技术,String常量池、数据库连接池、缓冲池等等都是享元模式的应用

qq_53273362的博客 144

学习设计模式《十九》——享元模式

 享元模式的本质是【分离与共享】

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1266

java设计模式学习之【享元模式】

这篇教程不仅提供了享元模式的理论基础,还通过具体的Java代码示例展示了如何实现和应用这种模式。简单理解,通俗易懂

qq_33129875的博客 1741

学习设计模式之享元模式

文章目录一、定义二、问题背景三、违背设计模式的设计实现1. 工程结构2. 代码实现四、问题改进1. 工程结构2. 代码实现3. 测试验证五、总结 一、定义 享元模式,主要在于共享通用对象,减少内存的使用,提升系统的访问效率。而这部分共享对象通常比较耗费内存或者需要查询大量接口或者使用数据库资源,因此统一抽离作为共享对象使用 另外享元模式可以分为在服务端和客户端,一般互联网H5和Web场景下大部分数据都需要服务端进行处理,比如数据库连接池的使用、多线程线程池的使用,除了这些功能外,还有些需要服务端进行包装后

南淮北安的博客 381

《Java设计模式学习》享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,是一种为提高系统的性能而开发的设计模式。它通过共享大量细粒度对象来减少内存占用,从而达到减少内存使用和提升系统性能的目的。在 Java 中,String 类就是应用了享元模式的典型例子。要理解享元模式,我们需要想象一个场景:你正在创建一个勾勒城市街道,包括许多相同的道路标记。每条路标记都有相同的颜色、形状和大小,但位置稍有不同。如果你用一个个不同的对象来表示不同的路标记,那么将会生成大量的内存占用。

一个不断前行的程序者 187
上一篇: Java多线程编程学习——03线程死锁
下一篇: 多线程编程学习——04线程的通讯机制
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值