享元模式

✍ dations ◷ 2024-09-20 08:50:38 #软件设计模式

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


相关

  • 潜伏期疾病潜伏期是接触病原体(可以是微生物或者是化学制剂、辐射等)后,症状和体征有明显的表现前所经过的时间。疾病潜伏期可能短至只有几分钟,或者长达几十年(克雅氏病大概为30年)。潜
  • 基本粒子粒子物理学中,基本粒子(英语:elementary particle)是组成物质最基本的单位。其内部结构未知,所以也无法确认是否由其它更基本的粒子所组成。随着物理学的不断发展,人类对物质构成
  • 冒口冒口(riser)也称为补给口(feeder),是在金属铸造(英语:metal casting)中为了避免因材料收缩(英语:Shrinkage (casting))而产生缩孔或是不平整处,额外所增加的材料储腔,不是最后铸件成品的
  • 月球旅游月球旅游,指的是在地球的天然卫星──月球上或是附近进行的太空旅游。有些太空旅游的新创公司计划在不久的将来便可以提供月球旅行,而也有些公司预估、或是声称:在2020到2043年
  • 禁食禁食(fasting),又称为断食,是指个人有意识地停止进食某些或所有食物,甚至饮料。禁食亦包括禁止食用某些特定食物(例如肉类、用不同方式处理的食物)。禁食行为存在于很多宗教的信仰
  • 松平恒雄松平恒雄(1877年4月17日-1949年11月14日),日本外交家和政治家。历任外务次官、驻英大使、驻美大使、宫内大臣、第一代参议院议长(国会议长)。明治时期前会津藩主、京都守护松平容
  • 建设发展办公室建设发展办公室(葡萄牙语:Gabinete para o Desenvolvimento de Infra-estruturas,GDI)是澳门特别行政区的政府部门,于2000年5月22日成立并由运输工务司监督。负责促进及协调一切
  • 第12333号行政命令1981年12月4日,美国总统里根签署了第12333号行政命令。这个行政命令,旨在扩大美国情报机构的权力和责任,并指示美国联邦机构领导人与中央情报局要充分合作。这个行政命令被称为
  • 小六鉴定考试小学六年级检定考试(马来语:Ujian Pencapaian Sekolah Rendah;英语:Primary School Achievement Test;简称UPSR)是马来西亚的一项全国统一考试,由马来西亚教育部(Ministry of Educat
  • 2009 Big Show (现场专辑)《2009 Big Show Live Album》是韩国男子音乐组合BIGBANG推出的第三张韩语现场专辑,由YG娱乐制作发布,在2009年4月22日正式发行。该专辑收录于2009年1月30日至2月1日在首尔奥