享元模式

✍ dations ◷ 2025-10-21 14:00:21 #软件设计模式

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


相关

  • 颈部颈(neck),又称脖子,是身体的一部分,通常指在生物中,身体连接头和躯干之间的那一部分。假如颈部被折断,该生物便会死亡。颈头钮 别称-颈喉钮 通常别人称恤衫最顶的那一钮叫颈头钮人
  • 生物胺生物胺泛指所有生源胺类物质,重要的例子有组胺、酪胺、血清素、儿茶酚胺和色胺。生物胺有内源生物胺和外源生物胺之分。
  • 少年维特的烦恼《少年维特的烦恼》(德语:Die Leiden des jungen Werthers)是第一部让歌德在德国几乎一夜成名的小说。本书于1774年秋天在莱比锡书籍展览会上面世,并在那里成了畅销书。它是歌德
  • font style=text-decoration: overlinen/font反中子(antineutron)是中子的反粒子,1956年,反质子被发现一年后,美国物理学家布鲁斯·考克(英语:Bruce Cork)在劳伦斯伯克利国家实验室发现了反中子,这种粒子的质量与中子相同,也不带
  • 魏斯密斯山魏斯密斯山(德语:Weissmies,4,017米(13,179英尺))是瑞士本宁阿尔卑斯山脉在瓦莱州萨斯费附近的一座山。它是four-thousander(英语:four-thousander)地区最东部的山。魏斯密斯山主阿
  • 凤尾菇“凤尾菇”,是真菌植物门真菌环柄侧耳Pleurotussajor-caju 的子实体。肉肥味美,在某些地区又称之为称秀珍菇;最早采自印度喜马拉雅山脚的Euphorbia royleans树。凤尾菇以台湾
  • 305医院中国人民解放军军徽中国人民解放军第三〇五医院,位于北京市西城区文津街甲13号,是中央军委联合参谋部直属单位,三级甲等医院。中国人民解放军第三〇五医院成立于1969年。地址位
  • 丹尼尔·德莱昂丹尼尔·德莱昂(英语:Daniel De Leon,1852年12月14日 - 1914年5月11日)是美国的一个社会主义政治家、报纸编辑、马克思主义理论家和工会组织者。他被认为是产业工联主义思想的先
  • 雷德伍德城雷德伍德城(英语:Redwood City;当地多采意译为红木城),是美国加州旧金山湾区的一个城市,位于旧金山湾区西部、旧金山半岛的东岸,也是圣马特奥县的首府。根据2010年人口普查,雷德伍德
  • 维克斯-阿姆斯特朗公司维克斯-阿姆斯特朗有限公司(Vickers-Armstrongs Limited)是英国的一家造船公司,由维克斯有限公司及阿姆斯特朗-惠特沃斯于1927年合并而成。公司大部分股份在1960-70年代间国有