概括

名称

Flyweight

结构

动机

运用共享技术有效地支持大量细粒度的对象。

适用性

  • 一个应用程序使用了大量的对象。

  • 完全由于使用大量的对象,造成很大的存储开销。

  • 对象的大多数状态都可变为外部状态。

  • 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。

  • 应用程序不依赖于对象标识。由于F l y w e i g h t 对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

解析

形象比喻:

每天给MM发短信,手指都累死了,最近买了个新手机,可以把一些常用的句子存在手机里,要用的时候,直接拿出来,在前面加上MM的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight, MM的名字就是提取出来的外部特征。

它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweightfactory负责维护一个对象存储池(FlyweightPool)来存放内部状态的对象。为了调用方便,FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。

优缺点:
1)享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
2)享元模式将享元对象的状态外部化,而读取外部状态使得运行时间稍微变长。

实例

1.Flyweight
      描述一个接口,通过这个接口flyweight可以接受并作用于外部状态。

2.ConcreteFlyweight
      实现Flyweight接口,并为内部状态(如果有的话)增加存储空间。
      ConcreteFlyweight对象必须是可共享的。它所存储的状态必须是内部的;即,它必须独立于ConcreteFlyweight对象的场景。

3.UnsharedConcreteFlyweight
      并非所有的Flyweight子类都需要被共享。Flyweight接口使共享成为可能,但它并不强制共享。
      在Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子节点。

4.FlyweightFactory
      创建并管理flyweight对象。
      确保合理地共享flyweight。当用户请求一个flyweight时,FlyweightFactory对象提供一个已创建的实例或者创建一个(如果不存在的话)。

涉及的文件

Flyweight. java   -- 接口

FlyweightImpl.java  -- 享元实现类

FlyweightFactory.java  -- 享元工厂

TestMain.java

/**   * @author oscar999   * @date 2013-7-29* @version V1.0   */
package designptn.flyweight;public interface Flyweight {void action(int arg);
}
/**   * @author oscar999   * @date 2013-7-29* @version V1.0   */
package designptn.flyweight;public class FlyweightImpl implements Flyweight {public void action(int arg) {System.out.println("Parameter Value is:" + arg);}
}
/**   * @author oscar999   * @date 2013-7-29* @version V1.0   */
package designptn.flyweight;import java.util.HashMap;
import java.util.Map;public class FlyweightFactory {private static Map<String, Flyweight> flyweights = new HashMap<String, Flyweight>();public FlyweightFactory(String arg) {flyweights.put(arg, new FlyweightImpl());}public static Flyweight getFlyweight(String key) {if (flyweights.get(key) == null) {flyweights.put(key, new FlyweightImpl());}return flyweights.get(key);}public static int getSize() {return flyweights.size();}
}
/**   * @author oscar999   * @date 2014-4-25* @version V1.0   */
package designptn.flyweight;public class TestMain {public static void main(String[] args) {// TODO Auto-generated method stubFlyweight fly1 = FlyweightFactory.getFlyweight("a");fly1.action(1);Flyweight fly2 = FlyweightFactory.getFlyweight("a");System.out.println(fly1 == fly2);Flyweight fly3 = FlyweightFactory.getFlyweight("b");fly3.action(2);Flyweight fly4 = FlyweightFactory.getFlyweight("c");fly4.action(3);Flyweight fly5 = FlyweightFactory.getFlyweight("d");fly5.action(4);System.out.println(FlyweightFactory.getSize());}}

FlyweightFactory.getFlyweight("a") 调用了两次, 只创建了一个Object, 节省了内存空间。

享元模式看上去和单态模式有点类似。

单态是一个Object,

而享元对应的是多个Object

[设计模式-结构型]享元模式(Flyweight )相关推荐

  1. 设计模式(18):结构型-享元模式(Flyweight)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  2. 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量

    前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...

  3. 结构型-享元模式-02-实例实现(围棋)

    结构型-享元模式-02-实例实现 1. 棋子抽象类(享元抽象类): 2. 白棋子(具体享元类): 3. 黑棋子(具体享元类): 4. 棋子坐标类(外部状态) 5. 享元工厂类 6. 客户端测试 7. ...

  4. java23设计模式---class10、享元模式(FlyWeight)

    文章目录 一.基本介绍 1.定义 2.优点 3.缺点 4.角色 1)抽象享元类 2)具体享元类 3)享元工厂类 4)组合享元类 5.内部状态和外部状态 二.应用情景 1.线程池 2.String 3. ...

  5. Net设计模式实例之享元模式( Flyweight Pattern)

    一.享元模式简介(Brief Introduction) 享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象. Use sharing to support larg ...

  6. 《研磨设计模式》chap20 享元模式 Flyweight (4)总结

    1. 不共享的外部状态 输入数据为: 张三,人员列表,查看,1 李四,人员列表,查看,1 李四,操作薪资数据,2 " 操作薪资数据"包括"薪资数据,查看",&q ...

  7. 《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍

    1.享元模式的定义 享元:分离出被缓存对象实例中,哪些数据是不变且重复出现的,哪些数据是经常变化的.(内部状态分离出来共享) 对象的内部状态: 不变且重复出现的数据, 对象的外部状态: 变化的数据 运 ...

  8. 《研磨设计模式》chap20 享元模式 Flyweight (3)重写应用场景

    public interface Flyweight {//判断传入的安全实体和权限,是否和享元对象内部状态匹配 public boolean match(String securityEntity, ...

  9. 《研磨设计模式》chap20 享元模式 Flyweight (1)前奏介绍

    场景:分配人员对各种数据表的权限,并验证权限操作. eg. 1. 正常编码(不使用模式) public class TestDB {//用来存放授权数据的值 public static Collect ...

最新文章

  1. DB2定时清理归档日志脚本
  2. Java黑皮书课后题第7章:*7.29(游戏:挑选四张牌)编写一个程序,从一副52张牌中选出4张,然后计算它们的和。Ace King Quee Jack分别表示1、13、12和11,显示得到和24的次
  3. java bean工厂_从零构建轻量级Java Web框架
  4. 链表删除功能实现演示
  5. 计算机在气象预测的应用,计算机在地面气象观测中的实际应用
  6. Python让繁琐工作自动化——chapter18 GUI控制键盘与鼠标
  7. java中==与equal()的区别
  8. Xcode更改Build输出路径
  9. ACL(标准/扩展访问控制列表)
  10. centos 解压压缩包到指定目录
  11. CC2652RB1F开发板烧录ZNP的固件
  12. _WIN32_WINNT not defined
  13. 如何用 Java 对 PDF 文件进行电子签章
  14. Abp vnext Web应用程序开发教程 5 —— 授权
  15. 数字藏品的交易平台有哪些 nft数字藏品
  16. 史上最全的Android文章精选合集
  17. 如何使用python-hwinfo获取Linux硬件信息?
  18. python求勾股定理_python入门学习随记(二)(勾股定理、球体积、利率、移位和进制转换、数字求和)...
  19. github.io 公共博客
  20. 动态给div背景图片赋值

热门文章

  1. git push提交时卡住
  2. Python 爬虫6——Scrapy的安装和使用
  3. fragment+tabhost与viewpager
  4. 关于SQL Server 2005 的自动远程数据库备份
  5. 结组开发项目(TD学生助手)
  6. 获取 Transaction Source
  7. 在 Tomcat 中部署 Java Web 程序 ( jar cvf *.war */. ) war 包
  8. 百度广告场景大数据治理应用实践
  9. 通俗易懂!视觉slam第七部分——四元数
  10. 王道机试指南读后总结-5(迷宫深搜问题详解)