本文源码:GitHub·点这里 || GitEE·点这里

一、使用场景

应用代码

public class C01_InScene {public static void main(String[] args) {String c0 = "cicada" ;String c1 = "cicada" ;System.out.println(c0 == c1); // true}
}

String类型就是使用享元模式。String对象是final类型,对象一旦创建就不可改变。在JAVA中字符串常量都是存在常量池中的,JAVA会确保一个字符串常量在常量池中只有一个拷贝,其中c0和c1就是一个字符串常量。结果为:true,说明c0和c1两个引用都指向了常量池中的同一个字符串常量"cicada"。这样的设计避免了在创建N多相同对象时所产生的不必要的大量的资源消耗。

二、享元模式

1、基础简介

享元模式是对象的结构模式。享元模式以共享的方式高效地支持大量的细粒度对象。常用于系统底层开发,解决系统的性能问题。像数据库连接池,里面都是创建好的连接对象,在这些连接对象中有需要的则直接拿来用,避免重新创建。

2、模式图解

3、核心角色

  • 抽象享元角色

给出一个抽象接口,以规定具体享元角色要实现的方法。

  • 具体享元角色

实现抽象享元角色所规定出的接口。如果有内部状态的话,必须为内部状态提供存储能力。

  • 享元工厂角色

负责创建和管理享元角色。必须保证享元对象可以被系统选择性共享。当一个客户端对象调用一个享元对象的时候,享元工厂角色会检查系统中是否已经有一个符合要求的享元对象。如果已经存在,直接返回该对象;如果系统中没有该享元对象,享元工厂角色就应当创建该享元对象。

4、内部外部状态

  • 内部状态指对象共享出来的信息,存储在享元对象内部且不会随环境的改变而改变。
  • 外部状态指对象得以依赖的一个标记,可以随环境改变而改变的、不可共享的状态。

5、源码实现

public class C02_FlyWeight {public static void main(String[] args) {FlyweightFactory factory = new FlyweightFactory();Flyweight fly = factory.factoryMethod('c');fly.printState("One");fly = factory.factoryMethod('d');fly.printState("Two");fly = factory.factoryMethod('c');fly.printState("San");// 调用了三次工厂方法,只创建了两个对象factory.poolInfo();}
}
/*** 抽象享元角色类*/
interface Flyweight {void printState (String state);
}
/*** 具体享元角色类*/
class ConcreteFlyweight implements Flyweight {private Character innerState = null;public ConcreteFlyweight (Character state){this.innerState = state;}@Overridepublic void printState(String state) {System.out.println("内部状态:" + this.innerState);System.out.println("外部状态:" + state);}
}
/*** 享元工厂角色类*/
class FlyweightFactory {// 模拟数据池private Map<Character,Flyweight> pool = new HashMap<>();public Flyweight factoryMethod (Character state){//先从缓存中查找对象Flyweight fly = pool.get(state);if(fly == null){fly = new ConcreteFlyweight(state);pool.put(state, fly);}return fly;}public void poolInfo (){System.out.println("数据池:"+pool);}
}

三、JDK应用场景

  • 测试代码块
public class C03_Integer {public static void main(String[] args) {Integer c1 = Integer.valueOf(127),c2 = Integer.valueOf(127) ;Integer c3 = new Integer(127),c4 = new Integer(127) ;boolean flag1 = c1==c2 ,flag2 = c2==c3,flag3 = c3==c4 ;// true;false;falseSystem.out.println(flag1+";"+flag2+";"+flag3);Integer c5 = Integer.valueOf(222),c6=Integer.valueOf(222) ;// falseSystem.out.println(c5==c6);}
}
  • 源码分析
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}

这里valueOf方法的意思就是,如果传入的数据在 (-128) 到 (127) 之间,则从缓存中直接返回,否则创建一个新的Integer对象。

四、模式总结

享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需一直创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率。经典的应用场景就是池技术,String常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池技术的重要实现方式。享元模式使得系统更加复杂。为了使对象可以共享,需要时刻管理对象的状态变化,这使得程序的逻辑变得复杂。

五、源代码地址

GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent

Java描述设计模式(18):享元模式相关推荐

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

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

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

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

  3. 北风设计模式课程---享元模式

    北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...

  4. 详解设计模式:享元模式

    享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...

  5. Java程序优化之享元模式

    享元模式主要目的是为了提高系统性能.它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象.享元模式是为数不多的为提升系统性能而生的设计模式 ...

  6. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  7. 每天一个设计模式之享元模式

    作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...

  8. 北风设计模式课程---享元模式与单例模式区别

    北风设计模式课程---享元模式与单例模式区别 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式与单例模式区别? 级别:单例模式是类级别的,一个类 ...

  9. .net设计模式 (享元模式)学习笔记

    运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短 结构性设计模式:关注的是类与类之间的关系 .net设计模式 (享元模式)学习笔记 ...

  10. 设计模式之享元模式详解

    设计模式之享元模式详解 概述 享元模式定义: ​ 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...

最新文章

  1. 关于SQL的基础知识点
  2. python的函数式编程玩法+年末小感
  3. 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
  4. HDUOJ-2094-产生冠军
  5. mongodb的条件查询笔记
  6. Docker 架构原理剖析,万字详解!
  7. asp.net MVC初学体会.
  8. oracle错误输出,oracle – SQL小提琴输出错误
  9. WINDOWS内核对象及其理解
  10. Linux内核开发-入门篇
  11. JavaScript,凯撒位移密码,算法
  12. java前后端分离,前端部署的方式
  13. python可以手眼定标吗_北京高碑店小学生Python编程周末班
  14. 单相半桥两电平电压型逆变器的正弦脉宽调制(SPWM)——Matlab程序
  15. postgresql查看数据库及数据表占用空间
  16. 公众号文章中怎样图文排版可以实现逐行显示?
  17. 【树莓派C语言开发】实验02:RGB小灯
  18. 论文解读:Hierarchical Topic Mining via Joint Spherical Tree and Text Embedding(通过联合球面树和文本进行的层次主题挖掘)
  19. Unity自动化碰撞体生成方法-Normal Collider 和 碰撞体代理
  20. 检测浏览器是否开启硬件加速

热门文章

  1. UI测试常见BUG汇总
  2. linux find 命令使用注意
  3. 计算机网络之数据链路层:16、无线局域网、802.11
  4. Linux系统编程29:进程信号之什么是信号及signal函数
  5. 3-1:常见任务和主要工具之软件包管理
  6. Linux 调整内核参数
  7. 关键段 互斥量 以及信号量
  8. pop3常用命令记录
  9. Python之OS模块:os.access()检验权限模式(验证文件及目录权限)
  10. Kali aircrack-ng wifi密码破解(暴力)(1)