文档章节

设计模式之享元模式

chenxkang
 chenxkang
发布于 2017/04/26 10:18
字数 696
阅读 1
收藏 0

       享元模式,属于创建型设计模式,它主要是用来减少创建对象的数量,以达到减少内存占用和提高性能的目的,通常与工厂模式一起使用。

  定义:运用共享技术有效地支持大量细粒度对象的重用。

  问题描述:当系统中存在大量的对象时,就有可能会造成内存溢出。

  解决方案:把这些对象中共同的部分抽象出来,如果有相同的业务请求,直接返回给内存中已有的对象,避免对象的重新创建。

  结构图

  举个栗子:讲一个黑色棋子和白色棋子的故事。。。

  故事中,黑色棋子和白色棋子可以共享,但是它们可以在棋盘上放置到不同的位置,那么位置就是棋子的外部状态,棋子本身作为其内部状态,作为享元角色,并由一个享元工厂负责创建和管理。具体实现方式如下:

  1. 新建一个抽象享元类Chessman,它是一个接口,定义了棋子必须实现的方法,包括内部状态和外部状态。代码如下:

          

  2. 分别新建两个具体享元类,黑色棋子BlackChessman和白色棋子WhiteChessman,均实现接口Chessman中定义的方法。代码如下:

          

          

  3. 新建一个享元工厂类ChessmanFactory,负责创建和管理享元角色。代码如下:

          

  4. 在使用者类中通过享元工厂类的实例分别创建黑色棋子和白色棋子,并分别设置各自的位置(外部状态)。代码如下:

          

  5. 运行后的效果,如图所示:

          

  以上就是享元模式的实现方式,由棋子判断是否相同我们可以看出黑色棋子或白色棋子在内存中只保存了一个对象,这样在一定程度上减少了内存中对象的个数,从而节约了系统资源,并且享元的外部状态相对独立,不会影响到内部状态,从而使得享元可以在不同的环境下被共享,提高了享元的复用能力,提高了系统性能。

 

  优点:大大减少了对象的创建,降低了系统的内存,提高了系统性能。

  缺点:提高了系统的复杂度,因为需要分离出享元的外部状态和内部状态;维护享元对象需要额外的开销。

  适用场景

  1. 系统中存在大量的相似的对象;

  2. 需要缓冲池的场景。

© 著作权归作者所有

共有 人打赏支持
chenxkang
粉丝 1
博文 20
码字总数 19128
作品 0
杭州
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
2018/05/18
0
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
2018/03/22
0
0
Java之23种设计模式解析(二)

B、结构模式(7 种) 我们接着讨论设计模式,上篇文章我讲完了 5 种创建型模式,这章开始,我将讲下 7 种结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模...

wersdffg
2015/02/15
0
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jenkins安装

https://my.oschina.net/u/593517/blog/1797968 jenkins 安装 https://my.oschina.net/u/593517/blog/3028175 GIT 安装 https://my.oschina.net/u/593517/blog/3028179 maven 安装 插件安装 ......

Gm_ning
16分钟前
1
0
小言服务端解决方案-监控

框架保证方向,整体包容细节 为保证服务端运行平稳正常,owner应使得系统应保有相应的监控:系统监控,业务监控。而服务运行的平稳高效是否有保障跟监控粒度又成直接的正比关系。本文仅针对开...

重城重楼
27分钟前
0
0
搜索引擎(Elasticsearch搜索详解)

学完本课题,你应达成如下目标: 掌握ES搜索API的规则、用法。 掌握各种查询用法 搜索API 搜索API 端点地址 GET /twitter/_search?q=user:kimchy GET /twitter/tweet,user/_search?q=user:...

这很耳东先生
51分钟前
7
0
浅谈如何减少GC的次数

GC会stop the world。会暂停程序的执行,带来延迟的代价。所以在开发中,我们不希望GC的次数过多。 本文将讨论如何在开发中改善各种细节,从而减少GC的次数。 (1)对象不用时最好显式置为 Nu...

浮躁的码农
53分钟前
1
0
jpa 自定义返回对象

任何ORM框架都少不了开放自定义sql的问题。jpa自然也不例外,很多场景需要写复杂sql的。 首先定义一个方法签名,然后打上@Query注解。像下面这样,需要注意nativeQuery,这个表示query中的字...

朝如青丝暮成雪
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部