享元模式

✍ dations ◷ 2025-11-29 11:21:08 #软件设计模式

享元模式(英语: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 (一种形式塑模语言)中的享元模式
  • "使你的程式飞起来 - 实作享元以改善效能"
  • "享元模式"
  • 结构模式 - 享元模式


相关

  • 信史商朝(约公元前1600年) 已经开始是信史年代。而夏朝作为中国历史上第一个朝代虽多见于后世史书,亦有同时期的文物遗迹出土,但至今尚未发现同时期的文字记载,故夏代并未出现信史,
  • 霸主霸主,是中国春秋时代强大诸侯国君主的头衔。今日,也称在某一方面地位极高者为霸主。在先秦古籍,“伯”、“霸”两字可以互通,“霸”本来是指诸侯中的长者,就像“伯”是指家族中的
  • 范晔范晔,可以是下列人物:
  • 第一滴血续集《第一滴血2》(英语:Rambo: First Blood Part II)是一部于1985年上映的美国军事动作片,由法国导演乔治·P·科斯马图斯执导,并继续由史泰龙出演约翰·兰博一角。影片虽然票房高,但
  • 沼泽獴属沼泽獴(学名 Atilax paludinosus) 是一种中等体型的獴科动物。一般体重在2.5-4.1公斤,体长46-62厘米,尾长32-53厘米。沼泽獴遍布在撒哈拉沙漠以南的非洲地区,是沼泽地带占重要生
  • 朝鲜标准时平壤时间(朝鲜语:평양시간/平壤時間 Pyŏngyangsigan),或称朝鲜民主主义人民共和国标准时间(朝鲜语:조선민주주의인민공화국 표준시간),是朝鲜使用的国家标准时间。2015年8月15日前
  • 巴伦苏埃拉 (菲律宾)巴伦苏埃拉(又译描仁瑞拉,英文:Valenzuela)是位于菲律宾马尼拉大都会的一个城市,位于马尼拉市北部14公里处,陆地面积44.59平方公里,建立于1621年,1998年升级为市,于2010年人口近60万,
  • 蚊子传播的疾病蚊子传播的疾病包括各种以蚊子为主要传播载体的疾病,包括有由病毒、寄生虫或其他病原体引起的疾病。在各种以动物为传播载体的疾病中,蚊子占有相当大的比重,从动物传动物、动物
  • 达尼埃尔·博韦达尼埃尔·博韦(Daniel Bovet,1907年3月23日-1992年4月8日)是一位瑞士裔的意大利药理学家。他出生于瑞士的弗洛伊里埃尔,是少数以世界语为第一语言的世界语母语者。1957年,他被授
  • 硝酸钛硝酸钛是一种化学性质活泼的无机化合物,化学式为Ti(NO3)4。硝酸钛可以由五氧化二氮和四氯化钛反应制得。