享元模式

✍ dations ◷ 2025-08-03 19:14:33 #软件设计模式

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


相关

  • 多孔菌多孔菌,属多孔菌科一种,是木栖腐生的中型菇类。该菇类生长于如台湾等地之低中海拔林区,生长期间约是在春夏两季之间。
  • CD33n/an/an/an/an/an/an/an/an/an/aCD33或称为Siglec-3(唾液酸结合Ig-样凝集素3,SIGLEC3,SIGLEC-3,gp67,p67)是一个粒细胞系的细胞表面表达的跨膜受体。它通常被认为是髓源性细胞所特
  • 魔数幻数(英语:Magic Number),又称魔数,是指原子核中质子数和中子数的某个特定数值。当质子数或中子数为幻数,或者二者取值均为幻数时,原子核会显示出较高的稳定性。目前已经确认的幻数
  • 厄巴纳市厄巴纳(Urbana /ɜːrˈbænə/),美国伊利诺伊州的一个城市,尚佩恩县县治所在地,人口39,484人。与尚佩恩市组成一个联结城镇“Champaign-Urbana”。厄巴纳市是伊利诺伊大学所在地
  • 缅语缅甸缅甸语(မြန်မာဘာသာ)属汉藏语系藏缅语族,以仰光音为标准。它是缅甸联邦的官方语言,在该国有大约3200万人使用,而且在孟加拉国、马来西亚、泰国、美国也有少量分布。
  • 全国产业复兴法《全国工业复兴法》(英语:National Industrial Recovery Act of 1933, NIRA,又译为全国产业复兴法)是美国国会于1933年制订的劳工法案和消费者保护法案,授权总统富兰克林·罗斯福
  • 洪城郡洪城郡(朝鲜语:홍성군/洪城郡 Hongseong gun */?),是大韩民国忠清南道西部的一个郡,西隔浅水湾与安眠岛相望。面积444.02平方公里,2009年人口88,176人。洪城郡内浦新都市为忠清南
  • 绿色和平广播电台绿色和平电台(英文:GreenPeace Broadcasting Station),全名绿色和平台湾文化广播电台,1995年2月6日开播。绿色和平电台绝大多数的节目都是纯闽南语台湾话发音。※新北部分地区(靠
  • 铸币铸币是种货币形式,是当今世界各国通用的造币形式之一。工匠往往预先按照设计样式,采用金属、冶炼、浇铸、成型、手工、制模,批量翻砂、铸造、打磨等方式制成;采用的金属原材料多
  • 渐逝波渐逝波(evanescent wave),又称为消逝波或,隐失波,是指当光波从光密介质入射到光疏介质时,发生全反射而光疏介质一侧所产生的一种电磁波。由于其振幅随与分界面垂直的深度的增大而