Java的23种设计模式:享元模式实战

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

享元模式是一种结构型设计模式,是池技术的重要实现方式,通过缓存共享对象的方式,增加对象复用率,降低内存消耗提高系统性能。 本文详细介绍了享元模式的代码分析、测试方法、优缺点、使用场景等,并贴出完整代码…

享元模式是一种结构型设计模式,是池技术的重要实现方式,通过缓存共享对象的方式,增加对象复用率,降低内存消耗提高系统性能。

本文详细介绍了享元模式的代码分析、测试方法、优缺点、使用场景等,并贴出完整代码和提供下载链接。

本文你将会获得以下知识:

  1. 享元模式的完整代码
  2. 享元模式的优缺点
  3. 享元模式的使用场景

适合人群:Java中高级开发。



一、前言

在日常项目开发过程中,个人觉得运用享元模式来设计需要用到缓存的业务场景,不但可以提升个人设计水平,而且还可以彰显个人技术魅力征服公司上级领导或者漂亮开发美眉。

二、概念介绍

  1. 抽象享元角色(Flyweight) 定义通用方法,同时定义外部状态和内部状态的接口规范
  2. 具体享元角色(ConcreteFlyweight) 继承抽象享元(Flyweight)并重写其定义的方法实现具体的业务功能
  3. 享元工厂角色(FlyweightFactory) 负责创建和缓存具体享元对象(ConcreteFlyweight)
  4. 内部状态 需要被共享的信息并不随环境改变而改变,作为属性被定义在具体享元类(ConcreteFlyweight)之中,比如:示例代码中的网站模板template
  5. 外部状态 不需要被共享的信息并随环境改变而改变,客户端调用抽象享元(Flyweight)抽象方法时作为参数传入,比如:示例代码中的公司对象Company各个组件之间的关系图如下: 在这里插入图片描述

三、代码分析

  1. 代码结构
    在这里插入图片描述
  2. 享元模式 下面我举一个网站建设的例子来讲解享元模式,某技术大牛在闲得蛋疼的工作之余接了一个网站建设外包项目,需求相当简单,就是根据每个客户提出的不同排版方式展示企业信息,技术高超的大牛三两下功夫就搞定了,客户1使用排版方式A,客户2使用排版方式2,以此类推客户N使用排版方式N,每增加一个客户就相应创建一个排版方式实例,随着客户不断的增多,即排版方式实例对象不断增多,另外还发现不少客户使用同样的排版方式(比如:客户3也是使用排版方式A),此时大牛感觉非常不妙,因为创建了太多实例占用了大量内存,导致系统变慢被客户投诉了。饱读诗书的大牛思索了一秒钟,灵光一现使用享元模式就可以完美解决问题了,具体代码请往下看。创建一个公司类(即客户),作为享元模式的外部状态,比如:客户1、客户2等等,每增加一个客户必须创建一个公司实例,不需缓存共享外部状态,代码如下:
    public class Company {   private String name;   public String getName() {       return name;   }   public void setName(String name) {       this.name = name;   }   public Company(){}   public Company(String name){       this.name = name;   }}

    创建一个网站抽象类,作为抽象享元角色,定义通用方法,同时定义外部状态(公司类)和内部状态的接口规范,代码如下:

    public abstract class WebSite {   public abstract void use(Company company); }

    创建一个网站模板类,作为具体享元角色,重写抽象享元定义的方法,代码如下:

    public class ConcreteWebSite extends WebSite {    private String template;   public  ConcreteWebSite(String template){    this.template = template;   }   @Override   public void use(Company company) {       System.out.println(\"网站模板:\"+template+\", 所属公司:\"+company.getName());}

    创建一个网站工厂类,作为享元工厂角色,负责创建和缓存享元对象,假如客户3也是使用排版方式A,这里就可以保证不会创建对象而是从缓存中获取,代码如下:

    public class WebSiteFactory { /**    * 缓存对象,key:模板,value:具体的网站    */   private Map<String,ConcreteWebSite> cache = new ConcurrentHashMap<>();   /**    * 根据模板获取网站    * @param template    * @return    */   public WebSite getWebSiteByTemplate(String template){       if(cache.containsKey(template)){           System.out.println(\"使用缓存 ==> \" + template);           return cache.get(template);       }else {           System.out.println(\"第一次查询,创建对象 ==> \" + template);           ConcreteWebSite site = new ConcreteWebSite(template);           cache.put(template,site);           return site;       }   }   /**    * 获取模板数量    * @return    */   public int getWebsiteTemplateSize(){       return cache.size();   }}

    享元模式测试代码如下:

    public class TestForFlyweight { public static void main(String[] args) {    WebSiteFactory factory = new WebSiteFactory();    WebSite companySite1 =  factory.getWebSiteByTemplate(\"模板A\");    companySite1.use(new Company(\"公司1\"));    System.out.println(\"==============================\");    WebSite companySite2 =  factory.getWebSiteByTemplate(\"模板B\");    companySite2.use(new Company(\"公司2\"));    System.out.println(\"==============================\");    WebSite companySite3 =  factory.getWebSiteByTemplate(\"模板A\");    companySite3.use(new Company(\"公司3\"));    System.out.println(\"==============================\");    System.out.println(\"网站模板总数:\" +factory.getWebsiteTemplateSize());   }} 

四、代码测试

享元模式,运行TestForFlyweight类中的main方法 控制台日志:

第一次查询,创建对象 ===> 模板A网站模板:模板A, 所属公司:公司1====================================第一次查询,创建对象 ===> 模板B网站模板:模板B, 所属公司:公司2====================================使用缓存 ===> 模板A网站模板:模板A, 所属公司:公司3====================================网站模板总数:2

在这里插入图片描述

五、优缺点

优点:

  • 相同或者相似对象在内存中只保存一份,降低了系统的对象数量,从而减少内存的消耗
  • 相对独立的外部状态被客户端作为自定义参数传入,从而使具体享受对象可以在不同的环境中被共享

缺点:

  • 需要把内部状态和外部状态分离出来,加大了程序逻辑复杂度

六、使用场景

  1. 期望避免系统存在大量的相同或者相似对象
  2. 同一个对象被大量的重复使用
  3. String字符串常量池
  4. 数据库连接池、线程池等池技术

七、总结

通过这次的享元模式实战,让我们掌握了享元设计模式是什么、代码如何编写及测试、优缺点及使用场景,学完本Chat内容后,可以快速把享元模式代码运用到日常开发中“肆无忌惮的装逼”,呵呵呵。

享元模式实战完整代码已上传到 Gitee,下载地址如下:https://gitee.com/romantic-pk/demo-flyweight.git

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。