享元模式

✍ dations ◷ 2024-12-22 23:43:46 #软件设计模式

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


相关

  • 有机磷中毒磷酸酯中毒或有机磷中毒(英语:Organophosphate poisoning),指由磷酸酯(英文简称为 OP)所导致的中毒。磷酸酯可用于杀虫剂、药物及神经性毒剂。中毒症状有唾液及泪液分泌增加、腹泻
  • 进化博弈理论现代生物分类群体从它们的 共同祖先遗传分化的图示。进化论介绍(英语:Introduction to evolution) 演化的证据 共同起源 共同起源的证据群体遗传学 · 遗传多样性 突变 · 自
  • 武昌教会武昌教会(Wu-Chang Church),全名“财团法人中华基督教浸信宣道会武昌教会”,是一间位于台湾高雄市的基督教新教教会。于1977年圣诞节,由宣教士万约翰牧师与当时三民教会执事黄明
  • 醋氨酚7.21 g/kg (0 °C) 8.21 g/kg (5 °C) 9.44 g/kg (10 °C) 10.97 g/kg (15 °C) 12.78 g/kg (20 °C) ~14 mg/mL (20 °C)对乙酰氨基酚(英语:Acetaminophen),又称
  • 讽刺与幽默《讽刺与幽默》是中华人民共和国的一份周报,由人民日报社主管,环球时报社主办。《讽刺与幽默》也是中国大陆创刊最早的漫画报纸,是迄今中国大陆持续时间最长的漫画刊物。《讽刺
  • 议会-经理制议会-经理制政府(Council–manager government)是主要的两种美国代议政制地方政府组成方式之一,相对于市长-议会制政府。在美国大部分人数多于1万2000人的城市都使用这个方式来
  • 仙霞岭仙霞岭,位于浙江省西部。东起衢州、金华、丽水三市交界处,西延浙江、江西、福建三省交界处。长约100余千米。主峰大龙岗海拔1503米。唐末,黄巢入闽,沿仙霞岭开山伐道,后世逐渐建
  • 阴茎切除术阴茎切除术是指通过手术手段切除阴茎留下睾丸与阴囊等性器官之后再造新的尿道口,虽然对男人的性征,性欲几乎不会影响。但是此后只能蹲式排尿或坐式排尿,而且比一般男性更会尿道
  • 新竹市消防博物馆新竹市消防博物馆,为台湾新竹市的一座消防博物馆,馆舍兴建于1936年,原本是新竹市消防局,主体建筑由六层楼的钟楼与二层楼的办公室组成。在日治时期,该建筑是全新竹市最高的建筑。
  • 尾辻加奈子尾辻加奈子(1974年12月16日-),日本LGBT人权运动者,政治家、前参议院议员(当选1次)。大阪府出身(但出生于奈良县)。前大阪府议会议员(堺市堺区选区。任期2003年4月~2007年4月)。是日本在