设计模式之享元模式

转载 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.
  }

相关文章推荐

【初学设计模式】Flyweight (享元)

设计模式, Design Patterns, Flyweight, 享元, C++, UML

黑马程序员_Java高新技术_基本类型数据的自动拆装箱及享元设计模式

------- android培训、java培训、期待与您交流! ---------- 基本类型数据的自动拆装箱及享元设计模式   自动装箱: Integer num1=10; 自动拆箱...

JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法

JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法 学完我们的java之旅,其实收获还是很多的,但是依然还...

java软件体系设计模式---享元

概念: a,内在信息:对象的内在信息是独立与对象所处环境的 b,外部信息:一个对象的外部信息是与对象所处华宁有关的,并且随着环境的变化而有所不同。 享元应用场合: 该应用需要创建大量的...

黑马程序员:享元设计模式

----------------------android培训、java培训、期待与您交流! ---------------------- 在张孝祥老师的JAVA基础强化教程的第11讲中提到了享...

JAVA设计模式:享元(Flyweight)

享元模式以共享的方式高效地支持大量的细粒度对象。         在面向对象的程序设计语言看来,一切事务都被描述成对象(Object)。对象拥有状态(属性)和行为(方法),我们将具有相同行为的对象抽...

黑马程序员_单例和享元设计模式

Java有23种设计模式。 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式...

设计模式读书笔记:Flyweight(享元)

意图: 运用共享技术有效地支持大量细粒度的对象。

黑马程序员——静态导入,可变参数,自动拆箱装箱以及享元设计模式 JDK1.5新特性

----------------------    android培训    java培训   期待与您交流!    ----------------------                ...

编程常用设计模式详解--(中篇)(适配器、装饰、代理、外观、桥接、组合、享元)

6.适配器模式 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。首先,我们...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之享元模式
举报原因:
原因补充:

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