设计模式--享元模式

设计模式 -- 享元模式(Flyweight Pattern) 使用共享对象可以有效的支持大量的细粒度对象。 应用场景 主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。例如:缓存,对象池;Android中: Message.obtain通过重用Message对象来避免大量的Message对象被频繁的创建和销毁。 FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeigh 阅读详情

简介

享元(Flyweight)模式的定义:运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的又橡来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
享元模式的结构与实现
享元模式中存在以下两种状态:
内部状态,即不会随着环境的改变而改变的可共享部分;
外部状态,指随环境改变而改变的不可以共享的部分。享元模式的实现要领就是区分应用中的这两种状态,并将外部状态外部化。下面来分析其基本结构和实现方法。

享元模式结构图如下:
在这里插入图片描述

角色

享元模式的主要角色有如下。
抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。

简单实现

1.创建抽象享元角色(Flyweight)

public interface Flyweight {
    public void operation(UnsharedConcreteFlyweight unsharedConcreteFlyweight);
}

2.创建具体享元(Concrete Flyweight)角色

public class ConcreteFlyweight implements Flyweight {

    private String key;

    public ConcreteFlyweight(String key) {
        this.key = key;
        System.out.println("具体享元"+key+"被创建!");
    }

    @Override
    public void operation(UnsharedConcreteFlyweight unsharedConcreteFlyweight) {

        System.out.println("具体享元"+key+"被调用!");
        System.out.println("非享元信息:" + unsharedConcreteFlyweight.getInfo());
    }
}

3.创建非享元(Unsharable Flyweight)角色

public class UnsharedConcreteFlyweight {
    private String info;

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public UnsharedConcreteFlyweight(String info) {
        this.info = info;
    }
}

4.创建享元工厂(Flyweight Factory)角色

public class FlyweightFactory {
    private HashMap<String, Flyweight> flyweights=new HashMap<String, Flyweight>();
    public Flyweight getFlyweight(String key)
    {
        Flyweight flyweight=(Flyweight)flyweights.get(key);
        if(flyweight!=null)
        {
            System.out.println("具体享元"+key+"已经存在,被成功获取!");
        }
        else
        {
            flyweight=new ConcreteFlyweight(key);
            flyweights.put(key, flyweight);
        }
        return flyweight;
    }
}

5.Client(Main验证)

public class FlyweightMain {
    public static void main(String[] args) {
        FlyweightFactory flyweightFactory = new FlyweightFactory();
        Flyweight f1 = flyweightFactory.getFlyweight("1");
        Flyweight f2 = flyweightFactory.getFlyweight("1");
        Flyweight f3 = flyweightFactory.getFlyweight("2");
        Flyweight f4 = flyweightFactory.getFlyweight("3");
        Flyweight f5 = flyweightFactory.getFlyweight("2");
        Flyweight f6 = flyweightFactory.getFlyweight("3");
        f1.operation(new UnsharedConcreteFlyweight("1 first"));
        f2.operation(new UnsharedConcreteFlyweight("1 second"));
        f3.operation(new UnsharedConcreteFlyweight("2 first"));
        f4.operation(new UnsharedConcreteFlyweight("3 first"));
        f5.operation(new UnsharedConcreteFlyweight("2 second"));
        f6.operation(new UnsharedConcreteFlyweight("3 second"));
    }
}

在这里插入图片描述

【Java设计模式】Java设计模式之(二十三)享元模式(Flyweight Pattern) 本文目录 一、组合模式介绍 1.1 含义 1.2 适用场景 1.3 主要解决 1.4 应用实例 1.5 优缺点 二、组合模式实现 2.1 类图 2.2 角色分析 2.3 代码实现 三、源码分析 这种类型的设计模式属于结构型模式。 一、组合模式介绍 1.1 含义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对 阅读详情

相关推荐

LabVIEW小白福音:手把手教你用NI采集卡搭建振动信号采集系统(附源码和避坑指南)

本文为LabVIEW初学者提供详细的NI采集卡振动信号采集系统搭建指南,涵盖硬件连接、驱动安装、信号处理及性能优化等关键步骤。特别针对振动信号采集系统中的常见问题提供解决方案,并附源码和避坑指南,帮助用户快速上手并避免常见错误。

weixin_30485379的博客 103

23种设计模式之享元模式(Flyweight Pattern)

本篇文章将23种设计模式中的享元模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

android OTA升级之后,apk崩溃无法启动

也就是说,我们这个高低版本是fingerprint相同的情况,这个问题追述到jenkins编译,启动job时会初始化一个BUILD_NUMBER值,这个值正好跟Android的build系统的名称重复,这就导致Android build系统那一套拼接时间戳的值不会走,因为jenkins一启动就会定义该值,而我们jenkins服务器迁移过,这个值又会从1开始累计,导致前后版本都是16,从而导致fingerprint一致。问题背景:系统版本从低版本升级到高版本后,apk崩溃启动失败。硬件平台:QCS6125。

kevin's cache的专栏 1346

23种设计模式——享元模式(Flyweight Pattern)

本文介绍了23种经典设计模式之——享元模式(Flyweight Pattern)的使用及说明

Meteors.的博客 1345

详解电路设计中的RC电路

​ 一、什么是RC电路 RC电路是指由电阻R和电容C组成的电路,它是脉冲产生和整形电路中常用到 的电路。 常见的RC充、放电电路、RC积分电路合RC微分电路接下来详细讲解。 二、RC充、放电电路 RC充、放电电路如下图所示,下面通过充电和放电两个过程来分析此电路。 ​RC充、放电电路图 (1)RC充电电路 RC充电电路图如下图(a)所示 RC充电电路图及充电曲线图 ​由上图分析: 将上图a中开关S置于“1”处,电源E开始通过电阻R对电容C充电,由于刚开始充电时电容两端没有..

IT xiaobai 4万+

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 599

设计模式之享元模式(Flyweight Design Pattern)

享元模式是八种结构型模式之一,享元就是共享单元(元素)的意思,可以理解是共享对象。享元模式的用途就是复用对象,节省内存。 如何使用享元模式,用棋牌室举例。 斗地主相信很多人都玩过,一副版,黑红花方四色,每一色都有从2到A的13张牌,加上大小王,共有54张牌。假如一张牌就是一个对象,一张桌子就要54个对象;一个牌室300张桌子;一个服务器有50个牌室;这样的服务器可能又有200个。那这样的对象就是54*300*50*200=162000000个。 ...

xjj1314的专栏 350

k8s学习笔记(3)--- kubernetes核心技术概念

kubernetes核心技术概念 1.API对象         API对象是K8s集群中的管理操作单元。K8s集群系统每支持一项新功能,引入一项新技术,一定会新引入对应的API对象,支持对该功能的管理操作。例如副本集Replica Set对应的API对象是RS。 2.集群(Cluster)         集群是指由...

梦谜的博客 1291

设计模式-享元模式(Flyweight Pattern)

享元模式 定义 Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象。 类型 结构型。 适用场景 在对象(相同或相似的对象)足够多的时候,而创建这些对象造成了很大的系统开销时,应该考虑使用享元模式。 享元有被频繁使用的场景,才有使用享元模式的价值,因为,在...

kaven 4493

详细推导波特图增益和相位曲线

文章来源:https://mp.weixin.qq.com/s/UCy9mRRok5Hc9qHq3qde5g 今天这篇文章想把近段时间关于波特图方面学习的内容整理一下。波特图将会是梳理闭环控制这个系列的开始。目前的计划是,以无源器件为基础,然后结合运放,再过渡到开关电源的环路控制方面。如果对这方面感兴趣的朋友,可以持续一起学习起来,目标就是掌握开关电源的闭环控制。 1. 什么是波特图? 波特图最常见的应用是在线性非时变的系统中,用于对传递函数的增益和相位进行分析,从而判断出系统随频率的响应是否稳定。因此,波

ltqdxl的博客 2万+

从零开始搭建企业级安全扫描平台:基于Docker的Greenbone和ClamAV部署指南

本文提供了一份基于Docker容器技术,从零开始搭建企业级安全扫描平台的实战指南。详细介绍了如何部署和集成漏洞扫描工具Greenbone与病毒扫描工具ClamAV,涵盖架构设计、Docker环境优化、容器化部署步骤以及平台集成与监控方案,帮助企业构建自动化、可扩展的安全防御核心组件。

delta的博客 755

秒懂设计模式之享元模式(Flyweight Pattern)

[版权申明] 非商业目的注明出处可自由转载 博文地址: 出自:shusheng007 设计模式汇总篇,一定要收藏: 永不磨灭的设计模式(有这一篇真够了,拒绝标题党) 文章目录概述类型难度定义使用场景UML类图实例第一步,定义一个共享对象通用的接口第二步,实现需要共享的对象类第三步,共享对象工厂第四步,客户端使用技术要点总结优缺点优点缺点总结 概述 也许你会觉得享元模式比较陌生,但是相信在你的软件开发生涯中应该不知不觉的用了很多次,只是你没有总结。例例如你肯定用到过缓存,用到过对象池… 不知道作为IT猿的.

ShuSheng007的程序人生 2340

从CMT2300A实战出发:Sub1G射频匹配电路设计要点与315MHz应用详解

本文从CMT2300A芯片实战出发,详细解析Sub1G射频匹配电路设计要点,特别针对315MHz应用场景。内容涵盖频段划分逻辑、调制方式选择、晶体振荡器设计等基础认知,以及315MHz匹配电路物料选型、巴伦网络处理等实战技巧,并分享PCB布局防干扰设计和实测验证方法,助力开发者优化射频通信性能。

weixin_29238147的博客 162

设计模式:享元模式(Flyweight Pattern)

享元模式是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。

TechNomad的博客 852

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

彻底搞懂设计模式DesignPattern-享元模式

对原理图的说明-即(模式的角色及职责) FlyWeight是抽象的享元角色,他是产品的抽象类,同时定义出对象的外部状态和内部状态的接囗或实现 2)ConcreteFlyWeight是具体的享元角色,是具体的产品类,实现抽象角色定义相关业务 UnSharedconcreteFlyWeight是不可共享的角色,一般不会出现在享元工厂 FlyWeight Factory享元工厂类,用于构建一个池客器(集合),同时提供从池中获取对象方法 ...

Ping 291

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式-10享元模式Flyweight Pattern

摘要:享元模式是一种结构型设计模式,通过共享相似对象来减少内存消耗和提高性能。它适用于系统中有大量相似对象且大多数状态可外部化的场景。模式包含享元接口、具体享元类、享元工厂和客户端四个主要部分。文中提供了两种实现示例:文本编辑器中的字符共享和图形渲染中的树对象共享,展示了如何通过工厂管理共享对象,显著减少实际创建的对象数量。

d3y1`5 81_09 960

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

J^T的博客 2693

Android设计模式之享元模式(Flyweight Pattern)

一 享元模式介绍:1.1 使用享元模式有什么好处? 享元模式是对象池的一种实现,主要目的是用来尽可能减少内存使用量。适合于存在大量重复对象的场景,来缓存可共享的对象,达到对象共享,避免创建过多对象的效果,这样可以提升性能。1.2 关于享元对象? 享元对象中的部分状态可以共享,可以共享的状态为内部状态(内蕴状态),内部状态不会随环境变化,不可共享的状态是外部状态(外蕴状态),外部状态随外部环境

happy_horse的博客 1989

设计模式-享元模式/Flyweight Pattern

设计模式-享元模式 参考资料:尚硅谷设计模式. 参考资料: 菜鸟设计模式. 萌新码农 摘自网络资源 + 自己的思考 若有错误请大佬们指点 参考资料网上重复篇章多 忘了参考了哪几位博主的文章 若有侵权 请私信 看到会加上链接 设计模式-享元模式设计模式-享元模式基本介绍内部状态和外部状态类图实例说明 基本介绍 享元模式(Flyweight Pattern)也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象

qq_34883222的博客 407

DesignPattern-享元模式

享元模式:String常量池,数据库连接池,缓冲池等等都是享元模式的应用。 每次创建字符创对象时候,都需要创建一个新的字符串对象的话,内存开销很大,所以如果第一次创建了字符串对象hunter,下次在创建相同的字符串hunter时,只是把它的引用再次指向hunter,这样就实现了hunter字符串内内存中的共享。 角色: Flyweight:抽象享元类,所有具体享元类的超类or接口, Concret...

其实我也没有太多期盼,毕竟一生太短,少有圆满 163

设计模式之享元模式详解(FlyWeight Pattern)

基本介绍 享元模式(Flyweight Pattern) 也叫 蝇量模式: 运用共享技术有效地支持大量细粒度的对象 常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有我们需要的则直接拿来用,避免重新创建,如果没有我们需要的,则创建一个 享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池...

Superman_peng的博客 640

设计模式 享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用,从而提高程序的性能。它特别适用于需要创建大量相似对象的场景,通过共享不变的部分来减少对象的数量和内存消耗。具体享元模式实现FlyweightInterface接口, 查看内外部状态。通过 Map 存储之前对象,获取之前的对象无需重新创建。定义 flyweight 的接口。

ling_zhi_xin的博客 1050

设计模式教程:享元模式(Flyweight Pattern)

通过共享相同的对象来减少内存的消耗,常用于大量相似对象的场景。

遇见伯灵说的博客 1055

C++设计模式——享元模式(flyweight pattern)

# 一、原理讲解 ## 1.1意图 运用共享技术有效地支持大量细粒度的对象。 ## 1.2应用场景 - 一个程序中使用了大量的对象; - 完全由于使用大量的对象造成很大的存储开销; - 对象的大多数状态都可变为外部状态; - 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象; - 应用程序不依赖于对象标识。 ## 1.3结构图(UML图) ![享元模式UML结构图](https://img-blog.csdnimg.cn/20200902222642384.jpg?x-oss-

净无邪博客 547

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

享元模式(Flyweight Pattern)又被称作轻量级模式、蝇量模式,它经典的体现就是对象池。享元模式的根本目的就是"共享单元",让对象能够共享复用,就像共享单车一样,路人甲(客户程序A)骑完路人丙(客户程序B)用,以此减少内存占用。

櫆溟的博客 487

Java 设计模式之享元模式(Flyweight Pattern)

旨在通过共享对象来有效支持大量细粒度对象的复用,从而减少内存占用和提高性能。假设需要绘制大量树(Tree)对象,树的类型(名称、颜色)可共享,位置和年龄为外部状态。类的常量池是享元模式的典型实现,相同字面量的字符串对象被复用。,适用于存在大量重复对象且对象的大部分状态可以外部化的场景。:通过共享内部状态减少对象数量,外部状态由客户端传递。:存在大量相似对象且内存占用是瓶颈时优先考虑。:享元工厂管理共享对象池,确保唯一性。:字符的字体、颜色、大小。:字符在文档中的位置。:子弹的位置、速度。

guanxin0206的博客 730
上一篇: 设计模式--访问者模式
下一篇: 设计模式-- 备忘录模式
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值