设计模式之享元模式

转载 2012年03月26日 10:55:04

享元模式

  享元模式(英语:Flyweight Pattern)是一种软件设计模式。它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
  典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字形有其字型外观, 字模 metrics, 和其它格式资讯,但这会使每个字符就耗用上千字节。取而代之的是,每个字符参照到一个共享字形物件,此物件会被其它有共同特质的字符所分享;只有每个字符(文件中或页面中)的位置才需要另外储存。以下程式用来解释上述的文件例子。这个例子用来解释享元模式利用只载立执行立即小任务所必需的资料,因而减少内存使用量。 
  public enum FontEffect {
  BOLD, ITALIC, SUPERSCRIPT, SUBSCRIPT, STRIKETHROUGH
  }
  public final class FontData {
  /**
  * A weak hash map will drop unused references to FontData.
  * Values have to be wrapped in WeakReferences,
  * because value objects in weak hash map are held by strong references. *
  /
  private static final WeakHashMap<FontData, WeakReference<FontData>> FLY_WEIGHT_DATA = new WeakHashMap<FontData, WeakReference<FontData>>();
  private final int pointSize;
  private final String fontFace;
  private final Color color;
  private final Set<FontEffect> effects;
  private FontData(int pointSize, String fontFace, Color color, EnumSet<FontEffect> effects){ this.pointSize = pointSize;
  this.fontFace = fontFace;
  this.color = color;
  this.effects = Collections.unmodifiableSet(effects);
  }
  public static FontData create(int pointSize, String fontFace, Color color, FontEffect... effects) { EnumSet<FontEffect> effectsSet = EnumSet.noneOf(FontEffect.class);
  for (FontEffect fontEffect : effects) {
  effectsSet.add(fontEffect);
  }
  // We are unconcerned with object creation cost, we are reducing overall memory consumption FontData data = new FontData(pointSize, fontFace, color, effectsSet);
  // Retrieve previously created instance with the given values if it (still) exists WeakReference<FontData> ref = FLY_WEIGHT_DATA.get(data);
  FontData result = (ref != null) ? ref.get() : null; // Store new font data instance if no matching instance exists
  if (result == null) {
  FLY_WEIGHT_DATA.put(data, new WeakReference<FontData> (data));
  result = data;
  }
  // return the single immutable copy with the given values
  return result;
  }
  @Override
  public boolean equals(Object obj) {
  if (obj instanceof FontData) {
  if (obj == this) {
  return true;
  }
  FontData other = (FontData) obj;
  return other.pointSize == pointSize && other.fontFace.equals(fontFace) && other.color.equals(color) && other.effects.equals(effects);
  }
  return false;
  }
  @Override
  public int hashCode() {
  return (pointSize * 37 + effects.hashCode() * 13) * fontFace.hashCode();
  }
  // Getters for the font data, but no setters. FontData is immutable.
  }

浅谈JAVA设计模式之——享元模式(Flyweight)

一、概述 运用共享技术有效地支持大量细粒度的对象。 二、适用性 当都具备下列情况时,使用Flyweight模式:        1.一个应用程序使用了大量的对象。        2.完全由于使用大...
  • l1028386804
  • l1028386804
  • 2015年05月07日 23:46
  • 1684

设计模式之禅【享元模式】

真刀实枪之享元模式 从报考系统的内存溢出说起 内存溢出的两种可能 内存泄漏:无意识的代码缺陷,导致的内存泄漏,JVM不能获得连续的内存空间 对象太多:代码写的不严谨,产...
  • eieiei438
  • eieiei438
  • 2018年01月12日 15:28
  • 188

JAVA设计模式之享元模式

解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象...
  • jason0539
  • jason0539
  • 2014年04月04日 07:34
  • 31568

享元设计模式 -- 线程的不安全性

这篇博客主要分析了下享元模式的线程不安全行,因为网上没找到相关的博客, 享元模式的学习参考: http://www.cnblogs.com/chenssy/p/3330555.html http...
  • u010926176
  • u010926176
  • 2015年07月10日 12:16
  • 1265

设计模式读书笔记-----享元模式

面向对象可以非常方便的解决一些扩展性的问题,但是在这个过程中系统务必会产生一些类或者对象,如果系统中存在对象的个数过多时,将会导致系统的性能下降。对于这样的问题解决最简单直接的办法就是减少系统中对象的...
  • chenssy
  • chenssy
  • 2013年09月20日 16:49
  • 6817

23种设计模式之_享元模式

一什么是享元模式 二享元模式几个角色抽象享元类Flyweight 具体享元类FlyWeightAImlFlyWeightBIml 享元工厂类FlyweightFactoiy 客户类Client 三享元...
  • o279642707
  • o279642707
  • 2017年02月07日 16:01
  • 541

Java设计模式——享元模式

在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。...
  • u013761665
  • u013761665
  • 2016年04月25日 13:35
  • 11089

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

当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。所以需要采用一个共享来避免大量拥有相同内容对象的开销。在Java中,String类型就是使用了享元模式。Strin...
  • yanbober
  • yanbober
  • 2015年05月04日 14:15
  • 3191

设计模式---享元模式(C++实现)

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,减少内存占用和提高性能。这种设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用...
  • My_heart_
  • My_heart_
  • 2017年03月16日 14:48
  • 625

Unity设计模式:享元模式

游戏中经常需要用到大量只是参数(比如坐标,旋转角,尺寸,颜色等)有些不同的重复物体,如植物,子弹,粒子等。如果数量非常多,在一个场景中逐一绘制这些对象将会消耗大量的性能。在学习OpenGL的时候我们知...
  • ylbs110
  • ylbs110
  • 2016年12月24日 20:33
  • 442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之享元模式
举报原因:
原因补充:

(最多只允许输入30个字)