享元模式(Flyweight Pattern)详解
https://www.cnblogs.com/amei0/p/7930013.html
享元模式(Flyweight Pattern)
定义:
采用一个共享来避免大量拥有相同内容对象的开销。这种开销中最常见、直观的就是内存的损耗。享元模式以共享的方式高效的支持大量的细粒度对象。
享元的英文是flyweight,是一个来自体育方面的专业用语,在拳击、摔跤和举重比赛中特指最轻量的级别。把这个单词移植到软件工程中,也是用来表示特别小的对象,即细粒度的对象。至于为什么把flyweight翻译为享元,可以理解为共享元对象,也就是共享细粒度对象。
享元模式中区分了内蕴状态和外蕴状态。内蕴状态不能改变,是可以共享的。外蕴状态是可以的改变的,不能共享,由客户端保持
。
模式组成:
Flyweight: 抽象享元类
。所有具体享元类的超类或者接口,通过这个接口,Flyweight可以接受并作用于外部专题ConcreteFlyweight: 具体享元类
。指定内部状态,为内部状态增加存储空间FlyweightFactory:享元工厂类
。用来创建并管理Flyweight对象,它主要用来确保合理地共享Flyweight,当用户请求一个Flyweight时,FlyweightFactory就会提供一个已经创建的Flyweight对象或者新建一个(如果不存在)。
uml类图:
模式分类:
- 单纯享元模式(即该对象没有外蕴状态,整个对象可以共享,类似于单例模式)
- 复合享元模式(该对象有内蕴状态,也有外蕴状态,内蕴状态共享)
优点:
- 极大的减少系统中对象的个数,节省内存的开销
- 避免创建过多的对象,提升性能
缺点:(这也算缺点?有待考究)
- 由于享元模式需要区分外部状态和内部状态,使得应用程序在某种程度上来说更加复杂化了
- 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长
应用场景:
- 存在大量重复对象的场景
在Java中,lang包下的Integer类
,对于经常使用的-128 到 127 范围内的Integer对象当类一被加载时就被创建了,并保存在cache数组中,一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象而不是创建一个新对象,这就是享元模式的应用。
java.lang.Integer#valueOf(int)
java.lang.Boolean#valueOf(boolean)
java.lang.Byte#valueOf(byte)
java.lang.Character#valueOf(char)
举个栗子:
定义抽象享元角色
abstract class Dish {public abstract void desc();
}
定义具体享元角色
class ButterMoshroom extends Dish {public String taste;public ButterMoshroom(String taste) {this.taste = taste;}@Overridepublic void desc() {System.out.println(taste + "酱野山菌");}
}
定义工厂
class ButterMoshroomFactory {static Map<String, Dish> dishes = new HashMap<String, Dish>();public synchronized static Dish getDish(String taste) {Dish dish = dishes.get(taste);if (dish == null) {dish = new ButterMoshroom(taste);}dishes.put(taste, dish);return dish;}
}
客户端调用
public static void main(String[] args) {ButterMoshroomFactory.getDish("xo").desc();ButterMoshroomFactory.getDish("番茄").desc();
}
输出
享元模式(Flyweight Pattern)详解相关推荐
- 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- 享元模式 Flyweight Pattern
享元模式的定义为:采用一个共享来避免大量拥有相同内容对象的开销. 这种开销中最常见.直观的就是内存的损耗.享元模式以共享的方式高效地支持大量的细粒度对象. 在名字和定义中都体现了共享这个核心概念,那么 ...
- Net设计模式实例之享元模式( Flyweight Pattern)
一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support larg ...
- 26享元模式(Flyweight Pattern)
面向对象的代价 面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能.但是,在 某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销.比 ...
- 设计模式(结构型)之享元模式(Flyweight Pattern)
PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...
- 设计模式:享元模式(Flyweight Pattern)
1.享元模式:也叫蝇量模式,运行共享技术有效的支持大量细粒度的对象. 2.享元模式常用于系统底层开发,解决系统的性能问题.比如数据库连接池,里面都是创建好的连接对象. 3.享元模式能够解决重复对象的内 ...
- 设计模式(18):结构型-享元模式(Flyweight)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- java23设计模式---class10、享元模式(FlyWeight)
文章目录 一.基本介绍 1.定义 2.优点 3.缺点 4.角色 1)抽象享元类 2)具体享元类 3)享元工厂类 4)组合享元类 5.内部状态和外部状态 二.应用情景 1.线程池 2.String 3. ...
- 享元模式 FlyWeight 结构型 设计模式(十五)
享元模式(FlyWeight) "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...
最新文章
- java 连接oracle数据库(最简单的使用)
- 惊呆了!两人发现抵用券漏洞,疯狂“薅羊毛”获利 770 余万
- linux测试网页装载时间,如何用Flood测试Web服务器响应时间
- 怎样查看哪些程序占用了swap空间
- 数据分析利器--Pandas
- 图像基础知识 —— Opencv图像处理
- 【20】java里的this和static
- 我和2035年有个约计算机论文,我和2035有个约
- 关于Unity3D脚本调试
- php地址地区选择器,区域选择 - 按大区及省市多选区域,可自定义用于其它业务 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
- 十八.描述符(__get__,__set__,__delete__)
- 文件流的使用以及序列化和反序列化的方法使用
- 实操-rapidminer进行关联分析、分类预测(使用相关算子,全流程讲解)
- Andriod 实现可拖动列表
- 服务器固态硬盘接口类型,怎么看固态硬盘接口?固态硬盘接口都有哪些类型?...
- 使用PhotoShop制作公章
- 单细胞论文记录(part19)--A comprehensive comparison on cell-type composition inference for ST data
- 论文中参考文献的引用步骤
- PCtoLCD2002 生成字模转换为字库 .h文件
- 【阅读论文】第六章--计算机辅助检测--博-自动化眼底图像分析技术可筛查糖尿病患者的视网膜疾病
热门文章
- R极简教程-7:读取数据
- 使用rand函数生成随机数来发红包
- Windows server2012 服务器修复CredSSP远程代码漏洞
- java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档
- CSGO系统拆解学习
- 【开源夏令营优秀开题报告】专题之二 - 嵌入式与智能硬件类合集
- 服务器整体爆率如何修改,土豪玩家是怎么玩游戏的?一口气收购全区物资,逼得官方修改爆率!...
- 基于Uniapp+SpringBoot实现微信小程序授权登录
- 微信小程序授权登录界面
- 小米手机文件误删还有救,这10个工具请收好!