享元模式

✍ dations ◷ 2025-12-03 11:41:50 #软件设计模式

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


相关

  • 环氧合酶环氧合酶(拉丁语:Cyclooxygenase,简称COX)是一种酶(又名酵素),负责合成重要的生物激素——前列腺素家族的导介物质。当身体组织受到某种刺激如外伤、感染等会激活环氧合酶,使花生四
  • 测定蛋白质结构是指蛋白质分子的空间结构。作为一类重要的生物大分子,蛋白质主要由碳、氢、氧、氮、硫等化学元素组成。所有蛋白质都是由20种不同的L型α氨基酸连接形成的多聚体,
  • 胡安·斐南迪兹板块胡安·斐南迪兹板块(Juan Fernandez Plate)是太平洋的小型板块,位于纳斯卡板块、南极洲板块和太平洋板块之间的三向联结构造(triple junction),以顺时针方向移动,智利的胡安·费尔
  • 行为地理学行为地理学属于应用地理学,是人文地理学的一支,研究人类在不同的地理环境下产生的行为过程、行为类型、行为决策、区位选择及其发展规律,也可视为地理学与心理学、行为学、社会
  • 深圳镇深圳镇曾是中国广东省宝安县辖下的一个镇,深圳市的“深圳”就是取自于深圳镇。深圳镇大致位于现时深圳市罗湖区内,而罗湖区的前身就是宝安县的深圳镇和附城公社。
  • 匈牙利圆桌会议匈牙利圆桌会议(匈牙利语:Ellenzéki Kerekasztal)于1989年秋季在匈牙利首都布达佩斯举行。匈牙利圆桌会议是受到波兰圆桌会议模式启发,是一系列书面化的、有秩序的并且高度尊重
  • 奥伯特赫尔曼·朱利叶斯·奥伯特 (Hermann Julius Oberth ,1894年6月25日-1989年12月28日)20世纪著名物理学家。被认为是继俄罗斯的康斯坦丁·齐奥尔科夫斯基和美国的罗伯特·戈达德后
  • 美国南北战争(4年3周6日) (最后一枚炮弹于1865年6月22日发射)联邦胜利亚伯拉罕·林肯埃德温·M·斯坦顿尤利西斯·S·格兰特 威廉·T·舍曼 大卫·法拉格特 乔治·B·麦克莱伦 亨利·韦
  • 收听时段时段(Dayparts)指的是在电台或电视台节目安排中,将一天划分成不同的部分,在不同的时段里播送不同类型的电视节目或电台节目。在电视时段安排中,某个时段的电视节目往往是针对该时
  • 永新县永新县是中国江西省吉安市下辖的一个县,位于罗霄山脉中段。下辖10镇、13乡、2个场。共有15个居委会、241个村委会。禾川镇、石桥镇、龙源口镇、澧田镇、龙门镇、沙市镇、文竹