什么是享元模式

享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象。享元对象能做到共享的关键是区分内蕴状态外蕴状态。一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同的,因此一个享元可以具有内蕴状态并可以共享。一个外蕴状态是随环境改变而改变的、不可以共享的状态。享元的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响到享元对象的内蕴状态,换句话说它们是相互独立的。

享元模式的结构图如下(源自大话设计模式)

Flyweight:是所有享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部状态。

ConcreteFlyweight:继承自Flyweight,是内部状态的具体实现。

UnsharedConcreteFlyweight:实现那些不需要共享的状态,从Flyweight接口派生使得共享成为可能,但是不强制共享。

FlyweightFactory:享元工厂,用来创建并管理Flyweight对象,他主要是用来确保合理地共享Flyweight,当用户请求一个Flyweight时,该工厂类会为其提供一个创建好的对象或者创建一个对象(如果不存在的话)并返回。

享元模式的应用

当以下所有条件都满足时,可以考虑使用享元模式:

1、 一个系统有大量的对象。

2、 这些对象耗费大量的内存。

3、 这些对象中状态中的大部分都可以外部化。

4、 这些对象可以按照内蕴状态分成很多组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。

5、 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。

使用享元模式,可以通过共享对象,节约存储的开销。比如Java中的String对象就是使用了享元模式。

享元模式的优点和缺点

享元模式的优点在于它大幅度降低内存中对象的数量。但是做到这一点它付出的代价也是很高的:

1、 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。

2、 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

最新文章

  1. CSS调试小技巧 —— 调试DOM元素hover,focus,actived的样式
  2. 表有主外键约束时的delete 方法 2008
  3. rhel6用centos163 yum源
  4. Ubuntu中vi常用命令
  5. Javascript动态加载Html元素到页面Dom文档结构时执行顺序的不同
  6. 013. asp.net统计网站访问人数
  7. 数据库锁机制(一)——概述
  8. poj 3468 A Simple Problem with Integers【线段树区间修改】
  9. Dojo实现Tabs页报错(一)
  10. Xcode的Hello World(简单易懂)
  11. 浮点数在计算机内存中的表示(IEEE 754规定1位是符号位,8位是指数,剩下的23位为有效数字)
  12. uva 12300 - Smallest Regular Polygon
  13. incallui中如何查询联系人数据
  14. 判断&数学&生活
  15. Android项目实战欢迎界面
  16. c/c++ 多线程 unique_lock的使用
  17. 【vue】iView-admin后台管理系统
  18. windows下揪出java程序占用cpu很高的线程
  19. vue-cli(vue脚手架)超详细教程
  20. 手工编程:hello world

热门文章

  1. Zen Coding – 超快地写网页代码(注:已更名为Emmet)
  2. CF960G Bandit Blues 第一类斯特林数+分治+FFT
  3. 【leetcode】126. Word Ladder II
  4. 百度小程序-图片画廊-使用previewImage方法实现
  5. 2,Spring MVC 学习总结(二)- 方法(Action)参数映射
  6. 左除与右除的区别--MATLAB
  7. java 标准输入输出流,打印流,数据流
  8. 【BZOJ3473&BZOJ3277】字符串(广义后缀自动机)
  9. CF 717A Festival Organization——斯特林数+递推求通项+扩域
  10. pug学习