享元模式

✍ dations ◷ 2025-07-09 16:00:31 #软件设计模式

享元模式(英语: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.}

外部链接

  • UML 和 LePUS3 (一种形式塑模语言)中的享元模式
  • "使你的程式飞起来 - 实作享元以改善效能"
  • "享元模式"
  • 结构模式 - 享元模式


相关

  • Fe(Csub5/subHsub4/subP(Csub6/subHsub5/su1,1'-双(二苯基膦)二茂铁,常简写为“dppf”,是一种常用取代膦,也是有机金属化学中的常用配体。dppf在其骨架中含有一个铁原子并与另两个桥联二苯基膦密切相连,如 1,1-双(二苯基膦)
  • NOF亚硝酰氟(NOF)是一种共价型的亚硝酰化合物。NOF是一种十分活泼的氟化剂,能将多种金属转化为它们的氟化物,并释放出一氧化氮:NOF也能与路易斯酸反应产生类似于盐的加合物,例如NOBF4
  • 软陶软陶被称作“低温泥”或者“烧烤粘土”,但其本质上并非陶或者黏土,而是一种加入了液态增塑剂的PVC材料,同时常加入高岭土等少量其他材料以获得不同的特性。软陶有各种颜色,常被
  • 恋尸恋尸,是个人对尸体表现爱恋或性吸引的现象。美国精神医学学会在《精神疾病诊断与统计手册》中把恋尸列为“性欲倒错”。但是恋尸行为的含意显然颇为多样。研究者在访谈恋尸者
  • 美国参议院司法委员会美国参议院司法委员会(英语:United States Senate Committee on the Judiciary)是美国国会参议院的常设委员会之一。司法委员会创立于1816年,是参议院中历史最悠久、也最具影响
  • 澳门艺术博物馆澳门艺术博物馆(葡萄牙语:Museu de Arte de Macau,英语:Macao Museum of Art),是位于澳门新口岸冼星海大马路澳门文化中心的博物馆,与澳门文化中心共同组成文化地标性建筑物。澳门
  • 杰士德加克里斯·塔克(英语:Chris Tucker),本名克里斯托弗·塔克(Christopher Tucker,1971年8月31日-)是一名美国男演员,出生于佐治亚州的亚特兰大。代表作有《尖峰时刻》系列。
  • 斯韦特兰娜·阿列克谢耶维奇斯韦特兰娜·亚历山德罗夫娜·阿列克谢耶维奇(白俄罗斯语:Святлана Аляксандраўна Алексіевіч,拉丁化:Svetlana Alexandrovna Alexievich,1948年
  • 德国精英大学计划德国精英大学计划(德语:Exzellenzinitiative)是德国联邦教育及研究部和德国科学基金会发起的,旨在提高促进德国大学科技研究和学术创新的计划。计划包括资助特定的杰出大学,资助
  • 砂纸砂纸是附着有研磨颗粒的纸。它用于平整物品的表面,或去除物品表面的附着物(如旧油漆),有时也用于增加摩擦力。砂纸根据不同的粗糙程度而分成不同的号码,以配合不同用途。最早关于