享元模式

✍ dations ◷ 2025-06-08 02:56:37 #软件设计模式

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


相关

  • 心电图心电图(Electrocardiography、ECG 或者 EKG)是一种经胸腔的以时间为单位记录心脏的电生理活动,并通过皮肤上的电极捕捉并记录下来的诊疗技术。这是一种无创性的记录方式。Elect
  • 运动员运动员是指的是一个人拥有高于平常人的身体条件,耐力,以及敏捷度等等,也因为以上条件而擅长于运动竞赛。古希腊文中的竞赛便为“athls”,而竞赛者称做“athletes”。从更特定的
  • 回声回声(或称回音)是指障碍物对声音的反射。借由声波反射可以做出回声定位的效果。声波在遇到障碍物时,一部分声波会穿过障碍物,而另一部分声波会反射回来形成回声。若障碍物具有坚
  • 几何结构在几何学中,凸正多面体,又称为柏拉图立体,是指各面都是全等的正多边形且每一个顶点所接的面数都是一样的凸多面体,是一种三维的正几何形状,符合这种特性的立体总共只有5种。在汉
  • 脓疱脓疡(拉丁语:abscessus; 德语:Abszess; 法语:Abcès; 英语:Abscess)又称作脓疮、脓肿。指的是在身体组织中蓄积的脓。接近体表的脓疡会有红、肿、热、痛等症状,触诊病灶时感觉其内
  • 沃尔夫医学奖沃尔夫医学奖(英语:Wolf Prize in Medicine),即以色列沃尔夫基金会(英语:Wolf Foundation)颁授沃尔夫奖之一,奖励那些在医学,特别是基础医学方面有重大发现的科学家。目前华人得主仅
  • 六块厝车站六块厝车站位于屏东县屏东市,为台湾铁路管理局屏东线的铁路车站。 在台铁捷运化计划中,原先预定将台铁高雄机务段及检车段迁至此处,并将本站改称屏东新站,取代高雄站纵贯线到达
  • 德仁天皇 德仁 皇后 雅子上皇 明仁上皇后 美智子德仁(日语:徳仁/なるひと Naruhito */?,1960年2月23日-)是日本第126代天皇,即今上天皇,年号为“令和”(日语:令和/れいわ Reiwa)。其为上
  • 在经济学上,汇率(英语:exchange rate,foreign-exchange rate,forex rate,FX rate,或Agio)定义为两国货币之间兑换的比例。通常会将某一国的货币设为基准,以此换算金额价值他国几元的
  • 西部扩张西部扩张(westward expansion)意旨美国在以“昭昭天命”(manifest destiny)为旗帜,透过战争与外交手段将领土向西推进至太平洋沿岸的联邦政府政策。