A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李玉生 中级黑马   /  2012-10-4 17:01  /  1224 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

张孝祥老师经典语录:



         享元模式就是有很多个小的对象,它们有很多属性相同,把它们变成一个对象,那些不同的属性把它们变成方法的参数,称之为外部状态,那些相同的属性称之为内部状态。



         (以下内空引自百度)  享元模式(英语: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 = newWeakHashMap<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.
  }

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马