背景
在我们编码开发过程中可能会遇到需要创建大量相同或相似对象实例问题。如果我们把这些对象都创建出来,会耗费系统资源。但是我们可以将这些公共的部分抽取出来,就会节省大量的系统资源。因此享元模式就这样出来了。
什么是享元模式
“Use sharing to support large numbers of fine-grained objects efficiently.(使用共享对象可有效地支持大量的细粒度的对象。)
”
享元模式的核心思想就是共享,相同的对象只保留一份。但是为了实现共享,不同的状态会提取到外部,从而增加了程序的复杂性。
享元模式主要有下面几个要素组成:
“”
抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
关系图如下:
享元模式
代码实现
UnsharedConcreteFlyweight
Flyweight
ConcreteFlyweight
FlyweightFactory
代码测试
测试结果:
具体享元a被创建!
具体享元a已经存在,被成功获取!
具体享元a已经存在,被成功获取!
具体享元b被创建!
具体享元b已经存在,被成功获取!
具体享元a被调用,非享元信息是:第1次调用a
具体享元a被调用,非享元信息是:第2次调用a
具体享元a被调用,非享元信息是:第3次调用a
具体享元b被调用,非享元信息是:第1次调用b
具体享元b被调用,非享元信息是:第2次调用b
从某种方面来说,这里是不是有点像单例模式呢。
关于享元模式的思考
如果项目中存在大量相似或相同的对象,使用享元模式可以节省很大的内存开销。
大家可以思考下,平时有没有具体场景可以使用享元模式,比如缓冲池的场景。
还有一个问题,享元模式核心在于数据共享,这样可能会导致线程不安全问题。在使用享元模式时,需要考虑线程安全的问题。
往期推荐
扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料
回复"java" 获取java电子书;
回复"python"获取python电子书;
回复"算法"获取算法电子书;
回复"大数据"获取大数据电子书;
回复"spring"获取SpringBoot的学习视频。
回复"面试"获取一线大厂面试资料
回复"进阶之路"获取Java进阶之路的思维导图
回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)
回复"总结"获取Java后端面试经验总结PDF版
回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)
回复"并发导图"获取Java并发编程思维导图(xmind终极版)
另:点击【我的福利】有更多惊喜哦。