享元模式

  • 使用环境
  • 示例
  • 享元模式在Android中的应用

如果在某个场景需要很多重复的对象,你会每次都创建一个对象吗?显然重复的创建大量对象是一种很差的体验。这是享元模式就可以帮到我们了,使用享元模式我们可以达到对象共享,避免创建过多的对象,从而提升性能,避免内存泄漏等。

使用环境

  • 存在大量相同的对象
  • 需要缓冲池的场景

示例

就拿火车售票系统来说,如果有成千上万的人搜索从北京到天津的火车票信息,如果每次请求售票系统都要创建一个从北京到天津的车票结果对象,那么数以万计的人不断请求,那么必然会造成大量对象的创建和销毁,使得GC工作频繁,造成内存抖动,内存高居不下等问题。而从一个地方到另一个地方的车票信息是有限的,我们只需要将它缓存起来,当下一次请求到来时,就可以使用缓存的对象,从而避免了对象的重新创建。这样就将成千上万的对象变成了可选择的有限数量的对象。

首先定义车票展示接口:

public interface TrainTicket {void showTicketInfo(String seat);
}

它的一个具体实现类是车票信息类,如下:

public class TrainTicketInfo implements TrainTicket{private String from;//始发站private String to;//目的地private String seat;//席别private int price;//价格public TrainTicketInfo(String from, String to) {super();this.from = from;this.to = to;}@Overridepublic void showTicketInfo(String seat) {// TODO Auto-generated method stubprice = new Random().nextInt(200);System.out.println("购买从"+from+"到"+to+"的"+seat+"火车票的价格是:"+price);}}

这个类中包含了起始站,目的站,席别及价格字段,如果不采用缓存的模式则是这种写法:

public class TicketFactory {

public static TrainTicket getTicket(String from,String to){return new TrainTicketInfo(from,to);
}

}

这种写法每次请求都会创建一个TrainTicketInfo对象,如果在短时间内有百万千万个用户请求北京到天津的火车信息,就会产生百万千万个对象,当对象变得无用时又会被回收,而GC也是十分消耗资源的。这种做法显然不好,可能会导致很多问题。

解决上面这种每次创建对象的形式也简单,就是首次请求时,将new出的对象缓存起来,等下次请求过来时直接使用即可。像这样:

public class TicketFactory {private static Map<String,TrainTicket> mTicketInfoMap = new HashMap<>();public static TrainTicket getTicket(String from,String to){String key = from+"_"+to;if (mTicketInfoMap.containsKey(key)) {return mTicketInfoMap.get(key);}else {           TrainTicket ticket = new TrainTicketInfo(from,to);mTicketInfoMap.put(key, ticket);return ticket;}}}

这样无论请求多少次,都会只有一个对象。

享元模式在Android中的应用

享元模式在Android中也有很多应用,如String常量。猜猜下面的代码的输出结果是什么?

String str1 = "123";String str2 = "12"+"3";System.out.println(str1 == str2);

答案是true;也就是说str1和str2是同一个对象,因为str2使用了缓存常量池中的str1的对象。享元模式还有很多的应用,如Message通过obtain拿对象其实这里面也是用的享元模式。

享元模式(对象共享)相关推荐

  1. 享元模式——对象共享,避免创建多对象

    1. 享元模式介绍 享元模式是对象池的一种实现,它的英文名称叫做Flyweight,代表轻量级的意思.享元模式用来尽可能减少内存使用量,他适合用于可能存在大量重复对象的场景,来缓存可共享的对象,达到对 ...

  2. 十八:享元模式(共享重复对象,分离不同对象)

    定义:享元模式(英语:Flyweight Pattern)是一种软件设计模式.它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件:它适合用于当大量物件只是重复因而导致无法令人接受 ...

  3. 实现对象的复用——享元模式

    本文转载自 :http://blog.csdn.net/lovelion/article/details/7667781 当前咱们国家正在大力倡导构建和谐社会,其中一个很重要的组成部分就是建设资源节约 ...

  4. Python设计模式-享元模式

    Python设计模式-享元模式 基于Python3.5.2,代码如下 #coding:utf-8class Coffee:name = ""price = 0def __init_ ...

  5. 享元模式 Flyweight Pattern

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

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

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

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

    概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题.例如在一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间,那 ...

  8. 享元模式(FlyWeight)

    享元模式使用场景: 内存属于稀缺资源,不要随便浪费.如果有很多个完全相同或相似的对象,我们可以用通过享元模式,节省内存. 享元模式的核心: 享元模式以共享的方式高效的支持大量细粒度对象的重用. 享元对 ...

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

    设计模式(十)享元模式Flyweight(结构型) 说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释 ...

  10. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

最新文章

  1. 雄关漫步真如铁 而今迈步从头越
  2. JS--切换图片总结
  3. quartz 报错:java.lang.classNotFoundException
  4. Leaflet中使用Leaflet.MagnifyingGlass实现放大镜效果
  5. VTK:PolyData之TriangleSolidColor
  6. python tempfile cleanup_Python tempfile模块:生成临时文件和临时目录
  7. SQL | 数据分析面试必备SQL语句+语法
  8. 【牛客 - 373C】抓捕盗窃犯(连通图,思维,dfs 或 并查集)
  9. 经典的十个机器学习算法
  10. 一文捋清Android消息机制
  11. 2020年的前端该怎么学?不吹不黑
  12. red hat 5.5 vncserver搭建
  13. 设计牛人——设计入门答疑番外篇有感
  14. 随心所欲玩复制 详解robocopy (完)
  15. windows中ping端口:tcping命令
  16. xmlspy2014下载安装(可用)
  17. Spring中Resource接口详解
  18. 用go填写pdf模板
  19. linux分段内存管理中的GDT,LDT,GDTR,LDTR
  20. ValueError: n_splits=n cannot be greater than the number of members in each class.

热门文章

  1. Fluke ADPT连接器给福禄克万用表插上翅膀----电容测量
  2. 工作汇报怎么写?4种工作汇报套路不可不知
  3. 免费http代理可用率高吗?
  4. requests.exceptions.ProxyError: HTTPSConnectionPool
  5. 使用JAVA编写“超市购物打印清单”——超亲民(直白点:纯纯小辣鸡的作品)
  6. LeetCode每日一题——953. 验证外星语词典
  7. 计算机音乐教学软件,音乐教学软件有哪些?小知大数智慧音乐教育平台学生使用手册...
  8. Git : 合并 commit 保持分支干净整洁
  9. 企业不可忽视的舆情监测管理办法,TOOM舆情监控工作总结?
  10. 在线数据库表转Java实体类 / SQL转Java实体类