zoukankan      html  css  js  c++  java
  • 公用技术——设计模式11——结构型模式——享元模式

    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:谈谈对享元模式的理解?

    答:享元模式的核心思想在于解决重复性导致的资源浪费。它的关键点有两个:

    1. 将重复的,可共享的与独有的,不可共享的相分离。在创建对象这个过程中是分离公共属性和私有属性。
    2. 资源。在创建对象这个过程中节约了内存。

    5、示例

    其实在生活中这种示例随处可见,例如用户共用电表,水表等等。在编程领域的示例有:

    • 游戏领域中的小怪,dota2或LOL中的小兵
    • 平台的智能机器人。
    • 直播平台的机器人账号。
  • 相关阅读:
    org.hibernate.QueryException: could not resolve property
    Eclipse支持文件UTF-8编码
    Eclipse External Tool Configration Notepad++
    WIN10 devtoolsuser
    Linux查看和注销用户(User)
    java list 去重
    监控系统对比 Ganglia vs Open-falcon vs Prometheus vs Zabbix vs Nagios vs PandoraFMS
    swagger 指定字段不显示到文档里
    mysql uuid() 相同 重复
    正则校验:微信号,qq号,邮箱
  • 原文地址:https://www.cnblogs.com/rain144576/p/9940892.html
Copyright © 2011-2022 走看看