设计模式之第12章-享元模式(Java实现)

  “怎么回事,竟然出现了OutOfMemory的错误。鱼哥,来帮我看看啊。”“有跟踪错误原因么?是内存泄露么?”“不是内存泄露啊,具体原因不知道啊。对了,有说新对象申请不到内存空间。”“这个原因么,我曾写过一篇博文:叫OutOfMemory简单分析。不过你的明显是因为代码问题,产生对象太多,导致内存被耗尽,正好一会有堂课,讲的正好能解决你的问题。”(嘿嘿,轮到我享元模式出场了~)

享元模式之自我介绍

  我,享元模式乃是池技术中的重要实现方式,具体定义如下:Use sharing to support large numbers of fine-grained objects efficiently.翻译过来就是说使用共享对象可以有效的支持大量的细粒度的对象。由定义可知两个要求:细粒度的对象和共享对象。前面那个人出现的问题就是内存溢出,就是因为分配了太多的对象导致了内存溢出,当然还会有损程序的性能。那么如何解决呢,没错就是我所提供的共享技术。在这之前先了解一下对象的外部状态以及内部状态。

  细粒度对象不可避免会使对象数量多且性质相近,那我们就将这些对象分为两部分,也就是外部状态和内部状态。下面解释一下内部状态与外部状态:

  • 外部状态:就是对象得以依赖的一个标记,随环境的改变而改变,不可以共享的状态,比如说用户名以及ID之类的信息。
  • 内部状态:就是对象可以共享出来的信息,存储在享元对象内部并且不会随环境的改变而改变,不必存储在具体某个对象中,属于可以共享的部分。

  我的类图如下:

  类图中每个类行驶的功能以及详细的介绍了,我也就不废话了。

享元模式之自我分析

  优点:

  • 减少应用程序创建的对象。
  • 降低程序内存占用。
  • 增强程序性能。

  缺点:

  • 提高了系统复杂性。
  • 需要分离出外部状态和内部状态。

享元模式之实现

  俗话说,没有银弹,但是却有通用的实现的代码,我水平那么高,自然会用通用的代码来实现我的模式~我的模式我做主,首先是抽象享元角色:

 public abstract class Flyweight{
//内部状态
private String intrinsic;
//外部状态
protected final String Extrinsic;
//要求享元角色必须接受外部状态
public Flyweight(String extr){
this.Extrinsic = extr;
}
//定义业务操作
public abstract void operate(); //内部状态的getter/setter
public String getIntrinsic(){
return intrinsic;
} public void setIntrinsic(String intrinsic)
{
this.intrinsic = intrinsic;
}
}

  抽象享元角色一般为抽象类,在实际项目中,一般是一个实现类,它是描述一类事物的方法,在抽象角色中,一般需要把外部状态和内部状态定义出来,避免子类随意扩展,下面是具体的享元角色实现的代码:

 public class ConcreteFlyweight extends Flyweight{
//接受外部状态
public ConcreteFlyweight(String extri){
super(extri);
}
//根据外部状态进行逻辑处理
public void operate(){
//业务逻辑
}
}

  这就是实现自己的业务逻辑,然后接收外部的状态,以便内部业务逻辑对外部状态的依赖,在抽象享元中加入final关键字也是有原因的,为了防止无意见修改导致池的混乱。

  下面是享元工厂:

 public FlyweightFactory{
//定义容器
private static HashMap<String, Flyweight> pool = new HashMap<>();
//享元工厂
public static Flyweight getFlyweight(String extri){
//需要返回的对象
Flyweight flyweight = null;
//判断是否在池中有该对象
if(pool.containskey(extri)){
flyweight = pool.get(extri);
}
else{
//根据外部状态创建享元对象
flyweight = new ConcreteFlyweight(extri);
pool.put(extri, flyweight);
}
return flyweight;
}
}

  通用代码就这么多,可以根据具体需要往里面套~具体的我就不多说了。

享元模式之使用场景

  当遇到以下情况时,就使用我吧,效果那是杠杠的:

  • 一个应用程序使用了大量的对象。
  • 完全由于使用大量对象造成很大的存储开销。
  • 对象的大多状态都是外部状态。
  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
  • 应用程序不依赖于对象的标识。

  以上。今天就到此为止。荆轲刺秦王,设计模式使我强~

  

  PS:本博客欢迎转发,但请注明博客地址及作者~

  博客地址:http://www.cnblogs.com/voidy/

  博客新址:http://voidy.net

  <。)#)))≦

 

设计模式之第12章-享元模式(Java实现)的更多相关文章

  1. 第11章 享元模式(Flyweight Pattern)

    原文 第11章 享元模式(Flyweight Pattern) 概述:   面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情况下,对象的数量可能会太多,从而导致了运行时 ...

  2. javascript设计模式学习之十二——享元模式

    一.享元模式的定义及使用场景 享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了. ...

  3. Java 设计模式系列(十一)享元模式

    Java 设计模式系列(十一)享元模式 Flyweight 享元模式是对象的结构模式.享元模式以共享的方式高效地支持大量的细粒度对象. 一.享元模式的结构 享元模式采用一个共享来避免大量拥有相同内容对 ...

  4. 设计模式之第19章-中介者模式(Java实现)

    设计模式之第19章-中介者模式(Java实现) “测试妹纸找你,你的代码出问题了.”“美工妹纸让你看看界面怎么样.”身为程序员总要和各种人打交道,但是如果再分为前端.后端工程师的话,那么关系就会错综复 ...

  5. 设计模式之第13章-职责链模式(Java实现)

    设计模式之第13章-职责链模式(Java实现) “请假都那么麻烦,至于么.”“咋的了?”“这不快过年了么,所以我想早两天回去,准备一下,买买东西什么的,然后去给项目经理请假,但是他说快过年了,所以这个 ...

  6. 设计模式之第2章-抽象工厂模式(Java实现)

    设计模式之第2章-抽象工厂模式(Java实现) “上次是我的不对,贿赂作者让我先讲来着,不过老婆大人大人有大量,不与我计较,这次还让我先把上次未讲完的应用场景部分给补充上去,有妻如此,夫复何求.”(说 ...

  7. 设计模式之第1章-工厂方法模式(Java实现)

    设计模式之第1章-工厂方法模式(Java实现) “我先来”,“不,老公,我先!”.远远的就听到几个人,哦不,是工厂方法模式和抽象工厂模式俩小夫妻在争吵,尼妹,又不是吃东西,谁先来不都一样(吃货的世界~ ...

  8. NET设计模式 第二部分 结构性模式(12):享元模式(Flyweight Pattern)

    享元模式(Flyweight Pattern) ——.NET设计模式系列之十三 Terrylee,2006年3月 摘要:面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题.但是在某些情 ...

  9. 《javascript设计模式与开发实践》阅读笔记(12)—— 享元模式

    享元模式 享元(flyweight)模式是一种用于性能优化的模式,"fly"在这里是苍蝇的意思,意为蝇量级.享元模式的核心是运用共享技术来有效支持大量细粒度的对象. 享元模式的核心 ...

随机推荐

  1. tf warning等级

    from:http://blog.csdn.net/tsinghuahui/article/details/72938764 tf讨厌的warning 2017-08-03 10:02:52.0990 ...

  2. Qt的各种使用技巧

    一.基本界面介绍 二.查看帮助的方法 ① 如上图所示,点击右侧帮助菜单查看帮助 ② 双击想要查看的代码,点F1,也会弹出帮助栏 三.修改文本编辑器颜色 长时间使用白底黑字的编辑器经常会使眼睛不舒服,以 ...

  3. JS实现正则表达式

    一.创建正则表达式 一共有两种方式: 1.直接量:var re = /[0-9]*/; 2.通过RegExp对象的构造函数:var re = RegExp("[0-9]*",&qu ...

  4. 解析ASPX网页__doPostBack分页的网页table数据

    由于急于上线的功能要去客服系统里抓取数据进行验证,客服方面又没有时间开发EDI接口给到我,所以用了本办法:爬人家web系统上的数据进行分析. 由于客服的web系统用ASP.Net的__doPostBa ...

  5. springMvc-reset风格和对静态资源的管理

    1.所谓rest风格及比较优雅的,没有一大堆后缀的风格 2.对静态资源的管理,及样式.图片等不需要springMvc过滤 代码: 1.在springMvc的配置文件中添加mvc标签 <?xml ...

  6. Python变量状态保持四种方法

    Python状态保持 ​ 全局 global def tester(start): global state state = start def nested(label): global state ...

  7. 【Orange Pi Lite2】 ——2《在使用之前的配置》(未完)

    [Orange Pi Lite2] --2<在使用之前的配置> 本文只在博客园发布 在开始前你需要准备的材料与软件 filezilla/或者不 声明 : 本教程适合0基础新手,本章将会介绍 ...

  8. 关于mongodb的日志

    mongodb的日志与profile相似,在启动mongod时 可以用verbose这个参数配置他的日志详细程度,分为一个v到5个v,其中v越多,详细度越高   mogod.conf port = d ...

  9. convert命令

    可以修改图片的分辨率 convert -resize 600×600 src.jpg dst.jpg src.jpg是你要修改的图片的名字 dst.jpg是新生成的图片名字

  10. 搭建mock服务器(微信小程序)

    搭建mock服务器(微信小程序) 如何在微信小程序使用mock.js实在是个问题,为了完全模拟访问路由和数据,选择在搭建本地mock服务器是一个不错的选择. 以下示例了一个mock服务器的搭建过程以及 ...