1、概念
享元模式是在大量创建相似对象时,将对象的”common state”或”share state”与”internal state”或”special state”分离。将common state封装为一个对象,并共享给所有对象,以此达到节约内存的目的。
它的关键点在于common state与internal state的划分。
2、UML图
3、代码
Novel对象,原始对象
/** * * @File Name: Novel.java * @Description: 小说实体类 * @version 1.0 * @since JDK 1.8 */ public class Novel { // 小说的名称,不可共享, internal state private String name; // 小说的作者, 不可共享, internal state private String author; // 小说的字体,可共享,都是宋体 private String font; // 小说使用的纸张大小,可共享,都是A4纸 private String paper; // get & set省略 }
现在假设要打印几万册,new几万个这样的对象,此时在内存中会存在上万个Novel对象,而对于font,paper这样的属性数据也会重复几万次。为了节约内存,把这些属性单独封装为一个对象,novel对象在内存中只需要重复”引用地址”即可。
改造之后的Novel对象
/** * * @File Name: Novel.java * @Description: 小说实体类 * @version 1.0 * @since JDK 1.8 */ public class Novel { // 小说的名称,不可共享, internal state private String name; // 小说的作者, 不可共享, internal state private String author; // 共享属性,font,paper。 private NovelCommonState commonState; // get & set省略 }
NovelCommonState对象
/** * * @File Name: NovelCommonState.java * @Description: 封装Novel实体类的共享属性 * @version 1.0 * @since JDK 1.8 */ public class NovelCommonState { // 小说的字体,可共享,都是宋体 private String font; // 小说使用的纸张大小,可共享,都是A4纸 private String paper; }
此时上万个Novel对象中保存的是commonState引用,NovelCommonState只创建了一次,节约了内存空间。
4、讨论
问题1:谈谈对享元模式的理解?
答:享元模式的核心思想在于解决重复性导致的资源浪费。它的关键点有两个:
- 将重复的,可共享的与独有的,不可共享的相分离。在创建对象这个过程中是分离公共属性和私有属性。
- 资源。在创建对象这个过程中节约了内存。
5、示例
其实在生活中这种示例随处可见,例如用户共用电表,水表等等。在编程领域的示例有:
- 游戏领域中的小怪,dota2或LOL中的小兵
- 平台的智能机器人。
- 直播平台的机器人账号。