专栏首页烟草的香味23种设计模式之享元模式

23种设计模式之享元模式

享元模式的定义

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

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

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

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

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

享元模式的类图如下:

其中的角色:

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

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

抽象享元角色代码:

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

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

具体享元角色代码:

享元工厂代码:

享元模式的应用

享元模式的优点和缺点:

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

享元模式的使用场景:

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

享元模式的扩展

1.线程安全的问题

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

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

2.性能平衡

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

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


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

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

本文分享自微信公众号 - 烟草的香味(hujing-bc),作者:胡靖哥哥

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JVM 垃圾回收机制

    首先JVM的内存结构包括五大区域: 程序计数器、虚拟机栈、本地方法栈、方法区、堆区。其中程序计数器、虚拟机栈和本地方法栈3个区域随线程启动与销毁, 因此这几个区...

    烟草的香味
  • 23中设计模式之抽象工厂模式

    抽象工厂类 AbstractCreator 的职责是定义 每个工厂要实现的功能,其代码如下:

    烟草的香味
  • Java 注解

    注解时在Java5中开始引入的概念。可以将注解想象成标签,给指定的方法、类、变量、参数、包等贴上一个标签。

    烟草的香味
  • Java设计模式(十一)享元模式

    转载于:https://blog.csdn.net/justloveyou_/article/details/55045638

    每天学Java
  • 设计模式-享元模式

    享元模式从字面上翻译是“蝇量级模式”,其实并不太好理解。这个模式的作用就是在一个系统当中有很多很多的对象,而这些对象很相似,有细微地方不同,单数数量太大,影响系...

    breezedancer
  • 享元模式

    享元模式Flyweight Pattern主要用于减少创建对象的数量,以减少内存占用和提高性能,其提供了减少对象数量从而改善应用所需的对象结构的方式,享元模式尝...

    WindrunnerMax
  • 设计模式(十二)享元模式

    享元模式定义 享元模式是结构型设计模式的一种,是池技术的重要实现方式,它可以减少应用程序创建的对象,降低程序内存的占用,提高程序的性能。 定义:使用共享对象有效...

    用户1269200
  • 《白话深度学习与Tensorflow》学习笔记(7)RBM限制玻尔兹曼机

    不受限的:在实际工程中用处不大,所以目前只需要研究受限玻尔兹曼机。 一层是可视化层,一般来说是输入层,另一层是隐含层,也就是我们一般指的特征提取层。 RBM是可...

    微风、掠过
  • bash: 一键安装 必备软件

    JNingWei
  • bash: 一键apt-get更新

    JNingWei

扫码关注云+社区

领取腾讯云代金券