专栏首页刘望舒设计模式(十二)享元模式

设计模式(十二)享元模式

享元模式定义

享元模式是结构型设计模式的一种,是池技术的重要实现方式,它可以减少应用程序创建的对象,降低程序内存的占用,提高程序的性能。

定义:使用共享对象有效的支持大量细粒度的对象

要求细粒度对象,那么不可避免地使得对象数量多且性质相近,这些对象分为两个部分:内部状态和外部状态。内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境的改变而改变。而外部状态是对象依赖的一个标记是随环境改变而改变的并且不可共享的状态。 享元模式结构图如图6-8所示。

在享元模式中有如下角色: - Flyweight:抽象享元角色,同时定义出对象的外部状态和内部状态的接口或者实现。 - ConcreteFlyweight:具体享元角色,实现抽象享元角色定义的业务。 - FlyweightFactory:享元工厂,负责管理对象池和创建享元对象。

享元模式简单实现

某宝商城卖商品,如果每个用户下单都生成商品对象显然会耗费很多资源,如果赶上双11,那恐怖的订单量会生成很多商品对象,更何况商城卖的商品种类繁多,这样就极易会产生OOM。因此我们采用享元模式来对商品的创建进行优化。

抽象享元角色

抽象享元角色是一个商品接口,它定义了showGoodsPrice方法用来展示商品的价格:

具体享元角色

定义类Goods,它实现IGoods 接口,并实现了showGoodsPrice方法,如下所示。

其中name为内部状态,version为外部状态。showGoodsPrice方法根据version的不同会打印出不同的价格。

享元工厂

享元工厂GoodsFactory 用来创建Goods对象。通过Map容器来存储Goods对象,将内部状态name作为Map的key,以便标识Goods对象。如果Map容器中包含此key,则使用Map容器中存储的Goods对象,否则就新创建Goods对象,并放入Map容器中。

客户端调用

客户端中调用GoodsFactory的getGoods方法来创建Goods对象,并调用Goods 的showGoodsPrice方法来显示产品的价格,如下所示。

运行结果为: 创建商品,key为:iphone7 价格为5199元 使用缓存,key为:iphone7 价格为5199元 使用缓存,key为:iphone7 价格为5999元

从输出看出,只有第一次是创建Goods对象,后面因为key值相同,所以都是使用了对象池中的Goods对象。在这个例子中,name作为内部状态是不变的,并且作为Map的key值是可以共享的。而showGoodsPrice方法中需要传入的version值则是外部状态,他的值是变化的。

享元模式的使用场景

  • 系统中存在大量的相似对象。
  • 需要缓冲池的场景。
  • 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份。

本文分享自微信公众号 - 刘望舒(liuwangshuAndroid),作者:刘望舒

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-02-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java虚拟机(三)垃圾标记算法与Java对象的生命周期

    前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的...

    用户1269200
  • Android P 适配指南

    Google自 android L (5.0) 以来就持续对安装系统进行 安全 以及 性能上的升级,此次的 android P (9.0)也不例外, 更大程度...

    用户1269200
  • Java虚拟机(一)结构原理与运行时数据区域

    前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚...

    用户1269200
  • 设计模式-享元模式

    享元模式从字面上翻译是“蝇量级模式”,其实并不太好理解。这个模式的作用就是在一个系统当中有很多很多的对象,而这些对象很相似,有细微地方不同,单数数量太大,影响系...

    breezedancer
  • 机器学习第3天:多元线性回归

    简单线性回归:影响Y的因素唯一,只有一个。 多元线性回归:影响Y的因数不唯一,有多个。

    明天依旧可好
  • 23种设计模式之享元模式

    上面定义中要求细粒度对象, 那么不可避免的使得对象数量多且性质相近, 我们将这些对象的信息分为两个部分: 内部状态和外部状态

    烟草的香味
  • 深度学习指南:基于Ubuntu从头开始搭建环境

    用户1737318
  • 博客园LaTex的测试,附带开启方法

    单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1。其他全都为0,eg:

    逸鹏
  • 策略升级 | 快速发现OWASP TOP 10 2017漏洞

    OWASP(开源Web应用安全项目)于2017年11月22正式发布OWASP Top 10 2017最终版本,作为全球网络安全500强, 云安全、...

    安恒信息
  • 虚拟机安装以及PCL的配置(2)

    http://www.pclcn.org/study/shownews.php?lang=cn&id=32

    点云PCL博主

扫码关注云+社区

领取腾讯云代金券