享元模式

✍ dations ◷ 2025-09-13 23:15:58 #软件设计模式

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


相关

  • NMDARN-甲基-D-天门冬胺酸受体(英语:N-methyl-D-aspartate receptor,简称NMDA受体或NMDAR)为麸胺酸盐受体,是一个主要的分子装置,控制突触的可塑性与记忆功能。NMDA受体是一种离子型麸
  • 曼德语族曼德语族(Mande languages,又译曼迪语族)是曼德人所讲的语言的分类,是与尼日尔-刚果语系比较疏离的一个支系,包含十多种语言,流行于西非各国,包括有:冈比亚、科特迪瓦、布基纳法索、
  • 杰弗里·泰勒杰弗里·泰勒爵士,OM(英语:Sir Geoffrey Taylor, 1886年3月7日-1975年6月27日),英国物理学家,数学家。他研究的领域是流体动力学与波理论。泰勒出生于英国,伦敦。他的父亲是一位艺术
  • 尤尔根·哈贝马斯尤尔根·哈伯玛斯(德语:Jürgen Habermas,1929年6月18日-),德国当代最重要的哲学家、社会学家之一。历任海德堡大学教授、法兰克福大学教授、法兰克福大学社会研究所所长以及马克
  • 马祖卡玛祖卡(波兰语:Mazurek),原为波兰一种民间舞蹈,其形式现在仍保留在许多芭蕾舞舞剧中,其音乐经过肖邦等人的发展后,已成为古典音乐中一种经典舞曲。玛祖卡起源于波兰中部马佐夫舍地
  • 海狮计划阿道夫·希特勒 埃里希·雷德尔(海军) 赫尔曼·戈林(空军)温斯顿·丘吉尔 杜德利‧庞德(海军) 西里尔·内维尔(空军)海狮计划(德语:Unternehmen Seelöwe)是第二次世界大战时纳綷
  • 十一面体在几何学中,十一面体(英语:Hendecahedron)是指具有十一个面的多面体。没有任何十一面体是正十一面体,也就是说找不到面由正多边形组成且每个面全等、每个角相等的十一面体。十一
  • 调兵山市调兵山市,原称铁法市,辽宁省铁岭市下辖县级市,位于辽宁省北部,铁岭县和法库县之间,丘陵地带。截至2013年,调兵山市下辖3个镇、2个街道,共计34个行政村、25个社区。截至2013年,调兵山
  • 历史哲学历史哲学是一个与历史学有关的哲学分支,旨在探讨历史的模式与意义、历史学的性质与方法、历史写作的结构与规律等问题。根据具体研究对象的不同,历史哲学大致可以分为三类:思辨
  • 夏季奥林匹克运动会高尔夫球比赛高尔夫曾在1900年奥运、1904年奥运成为正式项目。2016年奥运再次成为正式项目,男子项目奖牌与百年前相同,由英国与美国占据一席,瑞典拿到一面银牌成为首个非英美体系的夺牌国家