享元模式

✍ dations ◷ 2025-05-16 18:33:09 #软件设计模式

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


相关

  • 光通常指的是人类眼睛可以见的电磁波(可见光),视知觉就是对于可见光的知觉。可见光只是电磁波谱上的某一段频谱,一般是定义为波长介于400至700奈(纳)米(nm)之间的电磁波,也就是波长比
  • 洪涛洪涛(1931年12月26日-),山东荣成人,中华人民共和国科学家、中国工程院院士。早年毕业于山东医学院,后进入罗马尼亚科学院病毒学研究所获博士学位。1971年,担任中国医学科学院流行病
  • 科堡科堡(Cobourg)位于加拿大安大略省东部安大略湖畔,是诺森伯兰县的县治所在,人口约2万(2006年)。
  • 吴昌硕吴昌硕(1844年9月12日-1927年11月29日),初名俊,又名俊卿,字昌硕,曾用过字号昌石,别号缶卢、苦铁、大龙等,晚年在70岁之后,称自己为“吴字”。中国清末民初的篆刻家,亦工书法、绘画。浙
  • 致病岛毒力岛(英语:Pathogenicity island,PAIs,也译为致病岛)一词出现于1990年,是指一些微生物通过基因水平转移获得的一类基因组岛,通常出现在动物和植物的病原体微生物基因组里。此外,革
  • 新余市新余市,简称渝,古称新喻、新渝,是中华人民共和国江西省下辖的地级市,位于江西省中西部。市境东、西、北三面与宜春市接壤,南面与吉安市毗邻。地处赣西山地丘陵区与赣抚中游河谷阶
  • 黄梅莹黄梅莹(1950年7月7日-),上海人,中国大陆女演员,八一电影制片厂一级演员。1950年黄梅莹出生于上海一个知识分子家庭,父亲是工程师。因解放前爷爷是资本家,虽解放后将公司合营,但是文革
  • 伍长和平期间罕见军事强国有实力编制普通国家有实力编制伍(英语:Fireteam)是军队的编制单位,在班以下,一般约三到五人为一伍,多以资深或能力优异的士兵(上等兵)拔擢为伍长(准下士)。通常伍
  • 甘部甘部,为汉字索引中的部首之一,康熙字典214个部首中的第九十九个(五划的则为第五个)。在中文中,甘部归于五划部首。甘部通常是从下、左、右、中方均可为部字。且无其他部首可用者
  • 四硫化四砷四硫化四砷是一种无机化合物,化学式为As4S4。它在自然界中以雄黄的矿物形式存在。可溶于碱金属硫化物或氢氧化物溶液中。在空气中可氧化为三硫化二砷和三氧化二砷。四硫化四