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)详解相关推荐

  1. 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  2. 享元模式 Flyweight Pattern

    享元模式的定义为:采用一个共享来避免大量拥有相同内容对象的开销. 这种开销中最常见.直观的就是内存的损耗.享元模式以共享的方式高效地支持大量的细粒度对象. 在名字和定义中都体现了共享这个核心概念,那么 ...

  3. Net设计模式实例之享元模式( Flyweight Pattern)

    一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support larg ...

  4. 26享元模式(Flyweight Pattern)

    面向对象的代价     面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能.但是,在 某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销.比 ...

  5. 设计模式(结构型)之享元模式(Flyweight Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  6. 设计模式:享元模式(Flyweight Pattern)

    1.享元模式:也叫蝇量模式,运行共享技术有效的支持大量细粒度的对象. 2.享元模式常用于系统底层开发,解决系统的性能问题.比如数据库连接池,里面都是创建好的连接对象. 3.享元模式能够解决重复对象的内 ...

  7. 设计模式(18):结构型-享元模式(Flyweight)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. java23设计模式---class10、享元模式(FlyWeight)

    文章目录 一.基本介绍 1.定义 2.优点 3.缺点 4.角色 1)抽象享元类 2)具体享元类 3)享元工厂类 4)组合享元类 5.内部状态和外部状态 二.应用情景 1.线程池 2.String 3. ...

  9. 享元模式 FlyWeight 结构型 设计模式(十五)

    享元模式(FlyWeight)  "享"取"共享"之意,"元"取"单元"之意. 意图 运用共享技术,有效的支持大量细粒度 ...

最新文章

  1. java 连接oracle数据库(最简单的使用)
  2. 惊呆了!两人发现抵用券漏洞,疯狂“薅羊毛”获利 770 余万
  3. linux测试网页装载时间,如何用Flood测试Web服务器响应时间
  4. 怎样查看哪些程序占用了swap空间
  5. 数据分析利器--Pandas
  6. 图像基础知识 —— Opencv图像处理
  7. 【20】java里的this和static
  8. 我和2035年有个约计算机论文,我和2035有个约
  9. 关于Unity3D脚本调试
  10. php地址地区选择器,区域选择 - 按大区及省市多选区域,可自定义用于其它业务 – 基于ThinkPHP和Bootstrap的极速后台开发框架...
  11. 十八.描述符(__get__,__set__,__delete__)
  12. 文件流的使用以及序列化和反序列化的方法使用
  13. 实操-rapidminer进行关联分析、分类预测(使用相关算子,全流程讲解)
  14. Andriod 实现可拖动列表
  15. 服务器固态硬盘接口类型,怎么看固态硬盘接口?固态硬盘接口都有哪些类型?...
  16. 使用PhotoShop制作公章
  17. 单细胞论文记录(part19)--A comprehensive comparison on cell-type composition inference for ST data
  18. 论文中参考文献的引用步骤
  19. PCtoLCD2002 生成字模转换为字库 .h文件
  20. 【阅读论文】第六章--计算机辅助检测--博-自动化眼底图像分析技术可筛查糖尿病患者的视网膜疾病

热门文章

  1. R极简教程-7:读取数据
  2. 使用rand函数生成随机数来发红包
  3. Windows server2012 服务器修复CredSSP远程代码漏洞
  4. java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档
  5. CSGO系统拆解学习
  6. 【开源夏令营优秀开题报告】专题之二 - 嵌入式与智能硬件类合集
  7. 服务器整体爆率如何修改,土豪玩家是怎么玩游戏的?一口气收购全区物资,逼得官方修改爆率!...
  8. 基于Uniapp+SpringBoot实现微信小程序授权登录
  9. 微信小程序授权登录界面
  10. 小米手机文件误删还有救,这10个工具请收好!