享元模式

✍ dations ◷ 2025-02-23 21:07:44 #软件设计模式

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


相关

  • 文德圣文德,天主教译为圣文都辣,或译波拿文德拉、波那文都,O.F.M.(意大利语:San Bonaventura,1221年-1274年),是中世纪意大利的经院哲学神学家及哲学家。作为第七任方济各会总会长(英语:Lis
  • 固br /结br /纪固结纪(Statherian,符号PP4)是地质时代中的一个纪,开始于同位素年龄1800±0百万年(Ma),结束于1600±0Ma。固结纪期间蓝藻、细菌繁盛。固结纪属于前寒武纪元古宙古元古代;固结纪的
  • 破坏易燃易爆设备罪破坏易燃易爆设备罪,是指《中华人民共和国刑法》所规定的一个罪名,指故意破坏燃气或者其他易燃易爆设备,足以危害公共安全的行为。最高可判处死刑。根据《中华人民共和国刑法》
  • 1990年曼吉尔-鲁德巴地震1990年曼吉尔-鲁德巴地震,是1990年6月21日0点30分09秒发生于伊朗西北部的一个地震,震中位于首都德黑兰西北部约200千米的拉什特附近。此次地震的烈度达到了10度。该次地震造成
  • 灵菌红素灵菌红素(Prodigiosin,正式名称为2-methyl-3-pentyl-6-methoxyprodiginine)是Prodiginin(中文名不详)的一种。它具有Prodiginin的基本结构,也就是三吡咯环,其中的一个吡咯环C2上带
  • span class=nowrapLisub3/subPOsub4/sub/span&g磷酸锂是一种无机化合物,化学式为Li3PO4,难溶于水,更难溶于氨水。可溶性锂盐和磷酸盐反应,可以得到磷酸锂沉淀:磷酸锂可以用作一些有机反应的催化剂。
  • 新西兰自治领新西兰自治领,是新西兰殖民地的历史继承国。新西兰于1841年成为独立的英国皇家殖民地,之后又获得大量自治权。新西兰选择不加入澳大利亚联邦,而是于1907年9月26日由爱德华七世
  • 女歌手金奖“叱咤乐坛女歌手”是叱咤乐坛流行榜颁奖典礼每年的重点奖项,第一届即1988年起设立,至今共颁发93座,分为金、银、铜三个名次。此奖项赛果由全年叱咤903的播放率作依据,最后得出
  • 梅宏梅宏(1963年5月-),生于贵州余庆,原籍重庆,中国计算机软件专家,北京大学教授。1984和1987年分别于南京航空学院获学士和硕士学位,1992年于上海交通大学获博士学位,1994年从北京大学博
  • 欧洲LGBT权益女同性恋者、男同性恋者、双性恋者与跨性别者(LGBT)在欧洲的权益受到欧洲联盟与多国法律的保障。全球25个承认同性婚姻的国家中,有15个在欧洲,同时英国的英格兰、威尔士、苏格兰