23种设计模式之享元模式

享元模式的定义

定义: 使用共享对象可有效的支持大量的细粒度的对象

通俗的说, 就是将类的通用属性抽出来,建立对象池,以达到限制对象数量的效果

上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态

  1. 内部状态是对象可以共享出来的信息, 存储在享元对象内部并且不会随环境改变而改变. 如一个报考系统中的个人信息.
  2. 外部状态时对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态. 如报考系统中的报考科目. 享元模式通常以外部状态为参考来限制对象产生数量

说白了,内部状态就是每个对象都不同的属性,外部状态就是数量有限的属性, 如性别只有男女等

享元模式的类图如下:

23种设计模式之享元模式

 

其中的角色:

  1. Flyweight 抽象享元角色: 简单地说就是一个产品的抽象类,同时定义出对象的外部状态和内部状态的接口或实现
  2. ConcreteFlyweight 具体享元角色: 具体的一个产品类, 实现抽象角色定义的业务. 该角色需要注意的是内部状态处理应该与环境无关,不应该初恋一个操作改变了内部状态,同时修改了外部状态, 这是角色不允许的
  3. FlyweightFactory 享元工厂: 职责非常简单, 就是构造一个池容器,同时提供从池中获得对象的方法

享元模式的目的在于运用共享技术,使得一些细粒度的对象可以共享

抽象享元角色代码:

23种设计模式之享元模式

 

抽象享元角色一般为抽象类,在实际项目中一般是一个实现类, 它是描述一类事物的方法.在抽象角色中,一般需把外部状态和内部状态定义出来,避免子类的随意扩展. 我们对外部状态加上了final关键字, 防止意外发生.获得外部状态, 无意修改了一下, 池就混乱了.

在程序开发中, 确认只需要一次赋值的属性则设置为final类型,避免无意修改导致逻辑混乱.

具体享元角色代码:

23种设计模式之享元模式

 

享元工厂代码:

23种设计模式之享元模式

 

享元模式的应用

享元模式的优点和缺点:

享元模式是一个非常简单的模式, 它可以大大减少应用程序创建的对象,减低程序内存的占用,增强程序的性能,但它同时也提高了系统复杂性,需要分离出外部状态和内部状态, 而且外部状态具有固化特性,不应该随内部状态改变而改变,否则导致系统的逻辑混乱

享元模式的使用场景:

  1. 系统中存在大量的相似对象
  2. 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份
  3. 需要缓冲池的场景

享元模式的扩展

1.线程安全的问题

当使用享元模式时, 对象池中的角色数量是一定的, 可能在拿的时候不同线程同时拿到同一个对象.这是就出现线程不安全的问题了

我们在使用享元模式时要注意这个问题. 我们在使用享元模式时,对象池中的享元对象尽量多, 多到足够满足业务为止

2.性能平衡

既然是面向对象编程, 我们何不将外部状态抽离出来,定义为一个对象呢?

经过测试, 外部状态使用对象要比使用基本类型效率低. 所以, 外部状态最好以Java的基本类型作为标志, 如stirng、int等, 可以大幅的提升效率


享元模式在Java API中也是随处可见. 如Java的String就实现了对象池

需要说明一下的是,虽然可以使用享元模式实现对象池, 但是这两者还是有比较大的差异, 对象池着重在对象的复用上,池中的每个对象是可替换的,从同一个池中获得的A对象和B对象对客户端来说是完全相同的,它主要解决复用,而享元模式主要解决对象的共享问题,如何建立多个可共享的细粒度对象是其关注的重点.

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

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

相关文章

Ubicomp一些有意思的论文

[Ubicomp2016] ARTcode: Preserve Art and Code In Any Image 主要内容:研究团队来自上海交通大学王新兵老师团队。主要成果是在图片中嵌入信息(不同于现在,在二维码中间放一张小小图片)。方法:给一张图片&#xff0c…

设计模式之创建类模式PK

创建类模式包括: 工厂方法模式建造者模式抽象工厂模式单例模式原型模式 创建类模式能够提供对象的创建和管理职责. 其中单例模式和原型模式非常容易理解, 单例模式是要保持在内存中只有一个对象,原型模式是要求通过复制的方式产生一个新的对象,这两个不容易混淆. 工厂方法模…

设计模式之结构类模式PK

结构类模式包括: 适配器模式桥梁模式组合模式装饰模式门面模式享元模式代理模式 结构类模式着重于如何建立一个软件结构 为什么叫结构类模式呢? 因为他们都是通过组合类或对象产生更大结构以适应更高层次的逻辑需求. 结构型模式是为解决怎样组装现有的类,设计他…

设计模式之行为类模式PK

行为类模式包括: 责任链模式命令模式解释器模式迭代器模式中介者模式备忘录模式观察者模式状态模式策略模式模板方法模式访问者模式 行为型模式涉及到算法和对象间职责的分配 行为类模式关注如何管理对象的行为. 命令模式VS策略模式 策略模式和命令模式相似, 特别是命令模式…

射频(RF)基本理论:定义、特性、调制、扩频

参考: INTRO TO SDR AND RF SIGNAL ANALYSIS 一文让你读懂调幅、调相、调频、 与 I/Q 调制?它们的区别详解 无线网络技术教程(第二版) 金光、江先亮编 数字调制系列:IQ调制基本理论 1. 什么是射频? …

设计模式之规格模式

规格模式 规格模式 使用了策略模式,组合模式. 只不过将模式具体化了 规格模式将 与或非 操作进行了封装, 实现了类似 SQL查询语句的操作. 类图如下: 其中的角色如下: ISpecification 抽象规格书: 对规格书的抽象定义CompositeSpecification 组合规格书: 抽象类, 对规格书进…

低功耗广域网:关键特性

参考:《从创意到原型:物联网应用快速开发》 董玮 高艺 编著 介绍详细,适合初学无线网络和物联网的童鞋 —————————————————————————————————————— 低功耗广域网(LPWAN) 一.分…

设计模式之雇工模式

雇工模式 雇工模式也叫仆人模式, 其意图为: 雇工模式是行为模式的一种, 它为一组类提供通用的功能,而不需要类实现这些功能,它是命令模式的一种扩展. 其类图如下: 其中角色如下: IServiced : 用于定义服务内容的接口Serviced1 : 具体的服务提供者Servant : 执行者,即雇工类,…

Grove-Lora Radio:修改库函数使能修改扩频因子、带宽参数、码率

Grove-Lora Radio的使用详见:http://wiki.seeedstudio.com/cn/Grove_LoRa_Radio/ 但是网站中提供的Grove_LoRa_433MHz_and_915MHz_RF-master中的示例代码只能修改RF的频率,不能修改LoRa扩频因子、带宽等参数。研究了一下午,终于搞明白怎么修…

设计模式之对象池模式

对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并行处理), 在大多情况下, 指性能) 简单的说, 在需要时,从池中提取,不用时,放回池中,等待…

WiFi的基本调制过程

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 基本的WiFi调制分为以下三个步骤: 1. 将信号调制到正弦波上。 WiFi采用QAM(正交振幅调制),用I/Q信号表示的话&#…

设计模式之黑板模式

黑板模式的意图 黑板模式是观察者模式的一个扩展,知名度并不高,但使用的范围却非常广. 其意图为: 允许消息的读写同时进行, 广泛的交互消息. 简单的说, 黑板模式允许多个消息读写者同时存在, 消息的生产者和消费者完全分开. 这就像一个黑板, 任何一个老师(消息的生产者)都可以…

蓝牙调制

参考:Parallel Inclusive Communication for Connecting Heterogeneous IoT Devices at the Edge 《从创意到原型:物联网应用快速开发》 董玮,高艺编著 详解蓝牙标准中的GFSK调制:https://blog.csdn.net/lovehua365/article/detai…

设计模式之空对象模式

空对象模式 空对象模式是通过实现一个默认的无意义对象来避免null值出现, 简单地说,就是为了避免在程序中出现null值判断而诞生的一种常用设计方法. 举个简单的例子, 一个听动物叫声的模拟程序: 动物代码: 听叫声的人: 现在我们想, 能不能把 animal 的空值判断去掉呢?我们增…

树莓派安装mosquitto提示“MOSQ_1.5” not found

由于工作需要,我需要把树莓派上已经安装的mosquitto卸了,然后再安装一个新的。 安装的方法参考下面这个链接: http://www.52pi.net/archives/1718 但是重新安装的过程比较顺利,make install之后也没出现什么问题,但…

UML类图基础说明

UML类图主要由类和关系组成. 类: 什么具有相同特征的对象的抽象, 具体我也记不住, 反正有官方定义 关系: 指各个类之间的关系 类图 类就使用一个方框来表示, 把方框分成几层, 来表示不同的信息,如下图所示: 当然, 类图也不一定每一次都长这样, 比如你只分析各个类之间的关系…

J-flash 烧写cc2538教程

1. 打开J-falsh,所示如下界面 2. 配置相关参数。 菜单栏 Options → Project settings。按照如下框图选择。 3. 打开要烧写的文件。File → Open data file,选择要烧写的文件(一般为hex或bin文件) 4. 连接板子。Target → Connec…

跳表

概述 线性表中的链表是我们都很熟悉的结构了, 链表的增删优于数组, 但是不支持随机访问, 链表在查找时, 只能从头节点向后遍历, 那么针对链表, 能不能解决其访问效率的问题呢? 跳表来了, 顾名思义, 跳表就是可以跳跃的表, 我简单画了张图: 在原来链表的基础上, 建立一个新的…

论文写作——用excel和ppt做好看的论文图

论文写作——用excel和ppt做好看的论文图Excel 作图PPT保存前言:用matlab或者python作图,门槛较高,熟悉比较难。用excel和ppt就比较容易上手了。最近的论文全用ppt和excel作图,看着也不赖,在此记录一下一般的方法。 co…

蝌蚪与青蛙是同一个物种么?

最近在一本书上看到, 说蝌蚪的腿要是被砍了, 很快就可以在长出来, 而等他长成了青蛙, 却失去了这种能力. 于是我想, 为什么蝌蚪长成青蛙后, 就失去了这种能力呢? 是它在成长过程中的演变吗? 成年后没有继承少年时的能力. 还是说蝌蚪就是蝌蚪, 而青蛙就是青蛙? 如果说, …