享元模式

✍ dations ◷ 2025-06-29 20:05:29 #软件设计模式

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


相关

  • 祖先,又称祖亲、祖宗,是指辈分比自己高的直系血亲,与后代相反。然而,很多时候所指的祖先,通常都是最少隔几代,年代久远的则称为远祖。在很多父系社会,狭义的祖先一词只代指父亲那边
  • 第br /八第八第十埃及第八王朝是埃及历史上的一个王朝,文献记载很少。从埃及第六王朝开始,埃及陷入了内战和分裂中,埃及的习惯是不记录灾难,所以记载很少。而且原藏于亚历山大图书馆的马
  • 中兴里中兴里可能是指:
  • 荔枝湾荔枝湾(英语:Lychee Bay)是一个河涌,位于广东省广州市荔湾区西关泮塘一带,有二千多年的历史,历史上是有名消夏游乐地,素有小秦淮之称,荔湾区因此而命名。荔枝湾是西关涌(包括上西关涌
  • 阿卜杜拉一世阿卜杜拉·伊本·侯赛因(阿拉伯语:عبد الله الأول بن الحسين‎,1882年2月9日-1951年7月20日),外约旦埃米尔(1921年4月11日-1946年5月25日在位),外约旦国王(1946
  • 多摩动物公园多摩动物公园(日语:多摩動物公園/たまどうぶつこうえん)是东京都日野市的动物园,也称多摩动物园,是与恩赐上野动物园并列的日本知名动物园。作为都市公园的正式名称为都立七生公园
  • 黑背胡狼(C. mesomelas)黑背胡狼,又叫黑背豺,学名为Canis mesomelas,英文名为Black-backed Jackal。肩高40厘米(16英寸),体重9~14千克(20~31英磅)。因背部为黑色而得名。多栖息于非洲草原。黑背豺很少自己捕
  • 麻州麻州,唐朝时设置的州。贞观二十二年(648年)析郎州置,治所在今云南省宣威市。属戎州。辖境相当今云南省乌蒙山南段东南,革香河流域一带。后废。
  • 防止及惩治灭绝种族罪公约《防止及惩治危害种族罪公约》(Convention on the Prevention and Punishment of the Crime of Genocide)已经被联合国大会在1948年12月9日采为联合国大会第260号决议的内容,且
  • 特里卡拉州特里卡拉州(希腊语:Τρίκαλα)是希腊色萨利大区西北部的一个州。面积3,384平方公里,2005年人口137,723人。首府特里卡拉。下分23市、3镇。1881年建州。1947年卡尔季察州分