享元模式

✍ dations ◷ 2025-11-03 11:45:00 #软件设计模式

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


相关

  • 原发性醛固酮增多症原发性高醛固酮症(Primary aldosteronism),又称康氏症(Conn's syndrome),是肾上腺生产过量醛固酮而造成肾素水平下降而导致的一种疾病,通常症状不严重。大多数人会引起高血压,导致视
  • 假性怀孕假性怀孕是一种临床或是亚临床的症状,指生物在临床上出现一些怀孕的迹象(例如闭经、孕吐、乳房胀痛,甚至是腹胀,但事实上并非真正怀孕。临床上,人类以外的动物常出现假性怀孕(特别
  • 家蚕家蚕(学名:Bombyx mori)是鳞翅目的昆虫,丝绸的主要原料来源,在人类经济生活及文化历史上占有重要地位。原产中国,华南地区俗称之蚕宝宝或娘仔。家蚕的英文名为“silkworm”(意为“
  • β-羟-β-甲戊二酸单酰辅酶A(6-amino-9H-purin-9-yl)-4-hydroxy- 3-(phosphonooxy)tetrahydrofuran-2-yl]- 3,5,9,21-tetrahydroxy-8,8,21-trimethyl- 10,14,19-trioxo-2,4,6-trioxa-18-thia- 11,15-di
  • 共价键共价键(英语:covalent bond),是化学键的一种。两个或多个非金属原子共同使用它们的外层电子(砷化镓为例外),在理想情况下达到电子饱和的状态,由此组成比较稳定和坚固的化学结构叫做
  • 自杀论《自杀论:社会学的研究》(法语:Le Suicide : Étude de Sociologie),为爱米尔·涂尔干的一部巨著。该书从社会学的角度分析自杀的动因及分类。涂尔干着手进行研究自杀的人们的特
  • 653年Caregory:653年
  • 维科扬斯克山脉上扬斯克山脉(俄语:Верхоянский хребет,或有翻译维科扬斯克山脈)位于西伯利亚东部,纵贯俄罗斯的萨哈共和国,长1,000公里。位于勒拿河—阿尔丹河和亚纳河之间。南
  • 法律系北京大学法学院(Peking University Law School、PKU LAW、PKULS),原为北京大学法律系,前身是京师大学堂于1904年成立的法律学科,是中国历史最悠久的正规法律教育机构(其后为1909年
  • 大洋洲LGBT权益议题反对相关大洋洲各国对同性恋相关法律所持立场差异性极大,在五大州之间处于中间位置,性少数者能获得的权益总体上少于欧洲和美洲,多于亚洲和非洲。大洋洲多数国家由于存在被