Java描述设计模式(18):享元模式
本文源码: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):享元模式相关推荐
- Java设计模式之享元模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式之享元模式
Java设计模式之享元模式 1. 享元模式概述 1.1 享元定义 1.2 享元模式注意事项 2. 享元模式实现 1. 享元模式概述 1.1 享元定义 1)享元模式(享元模式)也叫蝇量模式:利用共享技术 ...
- 北风设计模式课程---享元模式
北风设计模式课程---享元模式 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式的本质是什么? 池技术:各种缓存池都是享元模式的体现 说到享元模 ...
- 详解设计模式:享元模式
享元模式(Flyweight Pattern),是对象池的一种体现,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 享元模式 主要用于减少创建对象的数量,以减少内存占用和提高性能.它提供了 ...
- Java程序优化之享元模式
享元模式主要目的是为了提高系统性能.它的核心思想是:如果在一个系统中存在多个相同的对象,那么只需要共享一份对象的拷贝,而不必为每一次使用都创建新的对象.享元模式是为数不多的为提升系统性能而生的设计模式 ...
- Java描述设计模式(05):原型模式
一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...
- 每天一个设计模式之享元模式
作者按:<每天一个设计模式>旨在初步领会设计模式的精髓,目前采用javascript和python两种语言实现.诚然,每种设计模式都有多种实现方式,但此小册只记录最直截了当的实现方式 :) ...
- 北风设计模式课程---享元模式与单例模式区别
北风设计模式课程---享元模式与单例模式区别 一.总结 一句话总结: 不仅要通过视频学,还要看别的博客里面的介绍,搜讲解,搜作用,搜实例 1.享元模式与单例模式区别? 级别:单例模式是类级别的,一个类 ...
- .net设计模式 (享元模式)学习笔记
运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题 合理应用扬长避短 结构性设计模式:关注的是类与类之间的关系 .net设计模式 (享元模式)学习笔记 ...
- 设计模式之享元模式详解
设计模式之享元模式详解 概述 享元模式定义: 运用共享技术来有效地支持大量细粒度对象的复用.它==通过共享已经存在的对象来大幅度减少需要创建的对象数量==.避免大量相似对象的开销,从而提高系统资源 ...
最新文章
- 关于SQL的基础知识点
- python的函数式编程玩法+年末小感
- 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
- HDUOJ-2094-产生冠军
- mongodb的条件查询笔记
- Docker 架构原理剖析,万字详解!
- asp.net MVC初学体会.
- oracle错误输出,oracle – SQL小提琴输出错误
- WINDOWS内核对象及其理解
- Linux内核开发-入门篇
- JavaScript,凯撒位移密码,算法
- java前后端分离,前端部署的方式
- python可以手眼定标吗_北京高碑店小学生Python编程周末班
- 单相半桥两电平电压型逆变器的正弦脉宽调制(SPWM)——Matlab程序
- postgresql查看数据库及数据表占用空间
- 公众号文章中怎样图文排版可以实现逐行显示?
- 【树莓派C语言开发】实验02:RGB小灯
- 论文解读:Hierarchical Topic Mining via Joint Spherical Tree and Text Embedding(通过联合球面树和文本进行的层次主题挖掘)
- Unity自动化碰撞体生成方法-Normal Collider 和 碰撞体代理
- 检测浏览器是否开启硬件加速