2.1 structure 结构性设计模式-Flyweight享元模式

FlyWeight 享元模式

[TOC]

结构性设计模式
又名轻量级模式

1. 简介

  • 使用共享技术支持大量细粒度的对象的共享。比如jdk种默认缓存Integer类型值为-127到128的对象。
  • 享元模式可以共享的相同内容称为内部状态Intrinsic State
  • 需要外部环境来设置的不能共享的内容称之为外部状态Extrinsic State
  • 享元模式种通常会出现工厂模式,需要创建一个享元工厂Flyweight Factory来负责维护一个享元池Flyweight Pool

2. 四种角色:Flyweight,Concrete Flyweight,Unshared Concrete Flyweight,Flyweight Factory

角色 个数
Flyweight:抽象享元类 一个
Concrete Flyweight: 具体享元类 多个
Unshared Concrete Flyweight:不共享具体享元类 多个
Flyweight Factory:享元工厂类 一个
  • Flyweight Factory 享元工厂类用来创建并管理Flyweight的子类。
    当用户请求一个Flyweight的时候,Flyweight Factory提供一个已创建的实例(包含共享的Concrete Flyweight 和不共享的 Unshared Concrete Flyweight)或者创建一个(不存在的话)。

3. 类图

Flyweight.png

4. 最佳实践

  1. 在享元模式的享元工厂类中通常提供一个静态的工厂方法用于返回享元对象,使用简单工厂模式来生成享元对象。
  2. 在一个系统中,通常只有唯一一个享元工厂,因此享元工厂类可以使用单例模式进行设计。
  3. 享元模式可以结合组合模式形成复合享元模式,统一对享元对象设置外部状态。

5. 适用场景和变种

适用场景

  1. 系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。
  2. 大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。
  3. 由于享元模式需要额外维护一个保存享元的数据结构,所以应当在有足够多的享元实例时才值得使用享元模式。

变种 特殊的两种享元模式:单纯享元模式 复合享元模式

  • 单纯享元模式
    上面介绍的享元模式包含可共享的内部状态和不可共享的外部状态。
    如果所有状态都可以共享,即只存在内部状态,则为单纯享元模式。
    这种,所有的具体享元类都是可以共享的,不存在非共享的具体享元类的享元模式是单纯享元模式。

  • 复合享元模式
    复合享元模式种有些享元对象是由协议单纯享元对象组合而成的,他们就是复合享元对象。虽然复合享元对象本身不能共享,但是他们可以分解成单纯享元对象而被共享。

6. 优缺点

  • 享元对象能做到共享的关键是区分内部状态(Internal State)和外部状态(External State)。

优点

  • 极大的减少内存种对象的数量,提升系统性能,节约内存。
  • 享元模式以共享的方式高效地支持大量的细粒度对象。

缺点

  • 享元模式使得系统更加复杂,需要分离出内部状态和外部状态,这使得程序的逻辑复杂化。
  • 为了使对象可以共享,享元模式需要将享元对象的状态外部化,而读取外部状态使得运行时间变长。

7. 应用场景举例 Integer,Long等5种基本类型的包装类的valueOf方法

  • Java中5中Number子类,即boolean,byte,short,int,long,char的包装类的valueOf方法
    Java中8种基本类型:boolean,byte,short,int,long,char,float,double,对应8个包装类,
    其中boolean,byte,short,int,long,char五种基本类型的包装类的 valueof方法中都使用了享元模式
    比如Long类的valueOf方法是这样实现的:
public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
}
  • 自己项目举例:
    //todo
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 226,130评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,210评论 3 410
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 173,639评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,755评论 1 304
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,694评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,160评论 1 317
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,359评论 3 433
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,436评论 0 282
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,990评论 1 328
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,981评论 3 351
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,089评论 1 359
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,669评论 5 353
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,363评论 3 342
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,762评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,950评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,689评论 3 384
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,124评论 2 368

推荐阅读更多精彩内容