十一、结构模式之享元(Flyweight)模式
什么是享元模式
享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象。享元对象能做到共享的关键是区分内蕴状态和外蕴状态。一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同的,因此一个享元可以具有内蕴状态并可以共享。一个外蕴状态是随环境改变而改变的、不可以共享的状态。享元的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。外蕴状态不可以影响到享元对象的内蕴状态,换句话说它们是相互独立的。
享元模式的结构图如下(源自大话设计模式)
Flyweight:是所有享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部状态。
ConcreteFlyweight:继承自Flyweight,是内部状态的具体实现。
UnsharedConcreteFlyweight:实现那些不需要共享的状态,从Flyweight接口派生使得共享成为可能,但是不强制共享。
FlyweightFactory:享元工厂,用来创建并管理Flyweight对象,他主要是用来确保合理地共享Flyweight,当用户请求一个Flyweight时,该工厂类会为其提供一个创建好的对象或者创建一个对象(如果不存在的话)并返回。
享元模式的应用
当以下所有条件都满足时,可以考虑使用享元模式:
1、 一个系统有大量的对象。
2、 这些对象耗费大量的内存。
3、 这些对象中状态中的大部分都可以外部化。
4、 这些对象可以按照内蕴状态分成很多组,当把外蕴对象从对象中剔除时,每一个组都可以仅用一个对象代替。
5、 软件系统不依赖于这些对象的身份,换言之,这些对象可以是不可分辨的。
使用享元模式,可以通过共享对象,节约存储的开销。比如Java中的String对象就是使用了享元模式。
享元模式的优点和缺点
享元模式的优点在于它大幅度降低内存中对象的数量。但是做到这一点它付出的代价也是很高的:
1、 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
2、 享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。
最新文章
- CSS调试小技巧 —— 调试DOM元素hover,focus,actived的样式
- 表有主外键约束时的delete 方法 2008
- rhel6用centos163 yum源
- Ubuntu中vi常用命令
- Javascript动态加载Html元素到页面Dom文档结构时执行顺序的不同
- 013. asp.net统计网站访问人数
- 数据库锁机制(一)——概述
- poj 3468 A Simple Problem with Integers【线段树区间修改】
- Dojo实现Tabs页报错(一)
- Xcode的Hello World(简单易懂)
- 浮点数在计算机内存中的表示(IEEE 754规定1位是符号位,8位是指数,剩下的23位为有效数字)
- uva 12300 - Smallest Regular Polygon
- incallui中如何查询联系人数据
- 判断&;数学&;生活
- Android项目实战欢迎界面
- c/c++ 多线程 unique_lock的使用
- 【vue】iView-admin后台管理系统
- windows下揪出java程序占用cpu很高的线程
- vue-cli(vue脚手架)超详细教程
- 手工编程:hello world
热门文章
- Zen Coding – 超快地写网页代码(注:已更名为Emmet)
- CF960G Bandit Blues 第一类斯特林数+分治+FFT
- 【leetcode】126. Word Ladder II
- 百度小程序-图片画廊-使用previewImage方法实现
- 2,Spring MVC 学习总结(二)- 方法(Action)参数映射
- 左除与右除的区别--MATLAB
- java 标准输入输出流,打印流,数据流
- 【BZOJ3473&;BZOJ3277】字符串(广义后缀自动机)
- CF 717A Festival Organization——斯特林数+递推求通项+扩域
- pug学习