享元模式

✍ dations ◷ 2025-08-24 15:31:49 #软件设计模式

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


相关

  • 路易氏体失智症路易氏体失智症(英语:Dementia with Lewy bodies,缩写为 DLB)是一种伴随着行为(英语:Behavior change (individual))、认知及活动功能退化(英语:Parkinsonism)的失智症,患者的记忆力虽
  • 空气动力学空气动力学(英语:Aerodynamics),是流体力学与气体动力学的一个分支,主要研究物体在空气中运动时所产生的各种力。空气动力学与气体动力学常常混用,但后者研究的气体不局限于空气。
  • ɾ̥清齿龈闪音是一种罕见的辅音,国际音标(IPA)记作⟨ɾ̥⟩,由齿龈闪音加上代表清音的修饰符所组成。X-SAMPA音标则写作4_0。据称在一些语言出现的清齿龈闪擦音可以理解为非常短暂
  • 板门店宣言《板门店宣言》(판문점 선언),简称《4·27宣言》(4·27 선언),韩国全称《为促进韩半岛和平、繁荣、统一的板门店宣言》(韩语:한반도의 평화와 번영, 통일을 위한 판문점 선언),朝鲜全
  • 八大第一台八大第一台(又称:GTV第一台),是八大电视旗下的综合娱乐频道。2014年10月27日起,启用高清版本“八大第一台HD”。
  • 卡洛·鲁比亚卡洛·鲁比亚(意大利语:Carlo Rubbia,1934年3月31日-),出生于戈里齐亚,意大利物理学家,因与西蒙·范德梅尔在欧洲核子研究组织共同发现W及Z玻色子而获得1984年诺贝尔物理学奖。鲁比
  • 王薇薇王薇薇(英语:Vera Wang;1949年6月27日-)是美国一名时尚设计师,主要活跃在纽约市。王薇薇出生于美国纽约市的一个华裔家庭,并在纽约市长大;她出生时所使用的英文名为Vera Ellen Wang
  • 1993年冬季世界大学生运动会第十六届冬季世界大学生运动会于1993年在波兰的扎科帕内与塔特拉举行。这是波兰首次主办冬季世界大学生运动会。吉祥物为沙布立克(Sablik,是扎科帕内的一种土拨鼠)王锦芳在两项
  • 亲代抚育亲代抚育(英语:Parental care),亦作亲代照顾,是一个行为学和演化学的专有名词,指人类或动物的父母辈对其子女的抚育行为。按照演化学的理论:亲代抚育行为令父母辈对子女所投放的关
  • CircaCirca(经常缩写为c., ca., ca, cca.,有时用斜体以表明其为拉丁文),意为“大约”,其字面意思是“周围”,一般是指一个日期。它在系谱学以及历史学著述中被广泛采用,当大概知道日期的