一.构成

单纯享元模式

  • 抽象享元角色:定义了公共的接口,所有的具体享元角色需要实现的接口,那些需要外蕴状态的操作可以通过方法的参数传入.
  • 具体享元角色:实现抽线享元角色所规定的公共接口,如果有内蕴状态的话必须负责为内蕴状态提供存储空间.享元内蕴状态的属性必须与对象所处的环境无关,也就是说内蕴状态是不可以变化的.从而使得享元对象可以在系统中公用.
  • 享元工厂角色:负责创建和管理享元角色,必须保证相同的外蕴状态可以使用同一个享元角色.当一个客户端带者外蕴状态来请求享元角色时,判断该享元角色是否存在,如果有,就直接返回该存在的享元对象,如果没有,就创建一个新的享元对象.
  • 客户端角色:需要维护所有享元角色的引用,维护所有的外蕴状态.

复合享元模式

  • 抽象享元角色:定义了公共的接口,所有的具体享元角色需要实现的接口,那些需要外蕴状态的操作可以桶盖方法的参数传入.
  • 具体享元角色(不同):实现抽线享元角色所规定的公共接口,如果有内蕴状态的话必须负责为内蕴状态提供存储空间.享元内蕴状态的属性必须与对象所处的环境无关,也就是说内蕴状态是不可以变化的.从而使得享元对象可以在系统中公用.
  • 复合享元角色:复合享元角色由具体的享元角色构成,它不可以被共享.
  • 享元工厂角色(不同):负责创建和管理享元角色,必须保证相同的外蕴状态可以使用同一个享元角色.当一个客户端带者外蕴状态来请求享元角色时,判断该享元角色是否存在,如果有,就直接返回该存在的享元对象,如果没有,就创建一个新的享元对象.
  • 客户端角色:需要维护所有享元角色的引用,维护所有具体享元角色的外蕴状态.

二.代码

单纯享元模式:例子(学生使用黄色的笔和蓝色的笔,不需要每次使用都创建对象,而是在工厂中维护了这两个对象)
public class MainTest {public static void main(String[] args) {IPen y1 = PenFactory.createIpen("yel");IPen y2 = PenFactory.createIpen("yel");IPen y3 = PenFactory.createIpen("yel");IPen bule = PenFactory.createIpen("bule");y1.write("语文作业");y2.write("数学作业");y3.write("英语作业");bule.write("语文作业");}
}//抽象的享元角色
interface IPen {void write(String article);
}// 具体的享元角色
class Pen implements IPen {private String color;public Pen(String color) {this.color = color;}@Overridepublic void write(String article) {System.out.println(this.hashCode() + "===" + color + "===" + article);}
}// 享元工厂角色
class PenFactory {private static final Map<String, IPen> map = new HashMap<>();public static IPen createIpen(String color) {IPen iPen = map.get(color);synchronized (color) {if (iPen == null) {iPen = new Pen(color);map.put(color, iPen);}}return iPen;}
}

输出

990368553===yel===语文作业
990368553===yel===数学作业
990368553===yel===英语作业
1096979270===bule===语文作业
复合享元模式(就是把单纯享元模式的多个对象组合起来,其中单纯享元模式还是共享的,复合享元角色不能共享)
本人对这里很不甚理解,如果有理解的大神求指点
public class MainTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("yel");list.add("yel");list.add("red");ListPen listPen = PenFactory.createListPen(list);listPen.write("语文作业");}
}//抽象的享元角色
interface IPen {// 提供外蕴状态void write(String article);
}// 具体的享元角色
class Pen implements IPen {private String color;public Pen(String color) {this.color = color;}@Overridepublic void write(String article) {System.out.println(this.hashCode() + "===" + color + "===" + article);}
}// 享元工厂角色
class PenFactory {private static final Map<String, IPen> map = new HashMap<>();// 创建单纯享元角色public static IPen createIpen(String color) {IPen iPen = map.get(color);synchronized (color) {if (iPen == null) {iPen = new Pen(color);map.put(color, iPen);}}return iPen;}// 创建复合享元角色public static ListPen createListPen(List<String> colors) {ListPen listPen = new ListPen();for (String color : colors){listPen.add(createIpen(color));}return listPen;}
}// 复合享元角色
class ListPen implements IPen{private List<IPen> list = new ArrayList<>();public void add(IPen iPen){list.add(iPen);}@Overridepublic void write(String article) {for (IPen iPen:list){iPen.write(article);}}
}

输出

990368553===yel===语文作业
990368553===yel===语文作业
1096979270===red===语文作业

三.特点

  • 解耦,把相同的属性和不同的属性抽取出来,而且对象的创建统一使用工厂来创建对象.
  • 提高了内存的使用效率,在内存中创建的对象明显减少,特别是在客户端多次调用的时候,维护的对象大大的减少.
  • 使得系统更加复杂,为了使得对象可以共享,需要将一些外部状态抽取出来,这使得程序的逻辑复杂化.
  • 对象的外部状态,读取外部的状态使得运行时间稍长.

四.使用场景(满足所有条件)

  • 一个应用程序使用了大量的对象.
  • 完全由于使用了大量的对象,造成很大的内存开销
  • 对象的大多数状态都可以变为外蕴状态
  • 如果删除对象的外部状态,那么可以用较少的共享对象取代很多组对象
  • 应用程序不依赖对象标识

五.参考文献

大话设计模式

java设计模式之享元设计模式相关推荐

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

    结构设计模式 - Flyweight设计模式 今天我们将研究Flyweight 设计模式,Flyweight设计模式又被称为 享元设计模式 . 目录[ 隐藏 ] 1 Flyweight设计模式 1.1 ...

  2. Java中的享元设计模式,涨姿势了!

    首先来看一段代码: public class ShareTest {public static void main(String[] args) {Integer a = 127;Integer b ...

  3. 设计模式之——享元设计模式

    享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式.享元模式尝试 ...

  4. Java设计模式(十八):享元设计模式

    1. 应用场景 当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空 ...

  5. Integer注意_享元设计模式

    public class IntegerNote{ public static void main(String[] args){   Integer d1=100;   Integer d2=100 ...

  6. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  7. Java设计模式之享元模式

    Java设计模式之享元模式 1. 享元模式概述 1.1 享元定义 1.2 享元模式注意事项 2. 享元模式实现 1. 享元模式概述 1.1 享元定义 1)享元模式(享元模式)也叫蝇量模式:利用共享技术 ...

  8. 设计模式:享元(FlyWeight)模式

    设计模式:享元(FlyWeight)模式 一.前言     享元(FlyWeight)模式顾名思义,既是轻量级的,原因就是享元,共享元素,这里的元素指的是对象.如何共享对象,那就是在检测对象产生的时候 ...

  9. python设计模式之享元模式

    一.享元模式定义: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思想是通过引入数据共享来提升性能. 在开发3D游戏时,例如有成千上万的士兵或者有成千上万棵树,如果一个3D地带的每 ...

最新文章

  1. 计算机网络实验二交换机配置Cisco,思科实验1计算机和交换机的ip地址设置
  2. 《快学 Go 语言》第 5 课 —— 神奇的切片
  3. oracle full outer join,oracle 内连接(inner join)、外连接(outer join)、全连接(full join)...
  4. 中石油训练赛 - Faulhaber’s Triangle(打表)
  5. python 异步 生产者 消费者_python 线程通信 生产者与消费者
  6. 牛客竞赛mjt的毒瘤赛
  7. 32岁已育国企技术女,上升无望,下一步如何做?
  8. 使用EDITPLUS编写C#控制台应用程序
  9. 驱动精灵w8ndows xp sp2,爱普生Epson TM-U220打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
  10. 影视剪辑,视频剪辑的万能剪辑技巧来啦,剪辑技巧合集
  11. C语言 简单的文件下载器
  12. c语言编程求阶梯数,c语言编程阶梯教程十二
  13. python虚拟变量回归_虚拟变量提升多元线性回归模型精度(附Python代码与数据)...
  14. C++使用OLE高速读写EXCEL的源码
  15. Ibeacon一维小项目
  16. 企业级360用户画像
  17. 关于跳跃连接 卷积网络
  18. GET和POST两种基本请求方法的区别 1
  19. 商业化广告--体系学习-- 7 -- 行业蓝图篇 --广告产品发展路径
  20. return的返回用法

热门文章

  1. 【前端学习笔记 CSS系列二十二】justify
  2. Bios读文件与Grub(bootload)和initrd和内核对文件系统驱动的支持
  3. 一文彻底说明分布式事务原理
  4. 前端 | 如何用html编写动态时钟
  5. 「C++控制台生存游戏」暗黑体素 DarkVoxel 控制台版
  6. BAD_POOL_CALLER蓝屏故障
  7. 马云布局大阿里蓝图:美好但需跋涉
  8. 幸福的烦恼—当本地化客户端遇上本地化服务器
  9. MongoDB复制集原理和配置
  10. 新大气模型有助宜居星球探索