Java设计模式之享元模式
一、概述
享元模式:"享"就是分享之意,指一物被众人共享,而这也正是该模式的宗旨所在。
享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。这个对象就可以避免修改的问题。
享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。二、示例
下面我们来看一个简单的例子:
建筑接口:JianZhupublic interface Jianzhu { void use(); }
体育馆实现类:TiYuGuanpublic class TiYuGuan implements Jianzhu { private String name; private String shape; private String yundong; public TiYuGuan(String yundong){ this.setYundong(yundong); } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getShape() { return shape; } public void setShape(String shape) { this.shape = shape; } public String getYundong() { return yundong; } public void setYundong(String yundong) { this.yundong = yundong; } @Override public void use() { System.out.println("该体育馆被使用来召开奥运会" + " 运动为:"+ yundong+" 形状为:"+shape+ " 名称为:"+name); } }
建筑工厂类:JianZhuFactoryimport java.util.*; public class JianZhuFactory { private static final Map tygs = new HashMap(); public static TiYuGuan getTyg(String yundong){ TiYuGuan tyg = tygs.get(yundong); if(tyg == null){ tyg = new TiYuGuan(yundong); tygs.put(yundong,tyg); } return tyg; } public static int getSize(){ return tygs.size(); } }
测试类:Clienterpublic class Clienter { public static void main(String[] args) { String yundong ="足球"; for(int i = 1;i <= 5;i++){ TiYuGuan tyg = JianZhuFactory.getTyg(yundong); tyg.setName("中国体育馆"); tyg.setShape("圆形"); tyg.use(); System.out.println("对象池中对象数量为:"+JianZhuFactory.getSize()); } } }
执行结果:该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆 对象池中对象数量为:1 该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆 对象池中对象数量为:1 该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆 对象池中对象数量为:1 该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆 对象池中对象数量为:1 该体育馆被使用来召开奥运会 运动为:足球 形状为:圆形 名称为:中国体育馆 对象池中对象数量为:1三、模式解析
如上示例中,使用工厂模式进行配合,创建对象池,测试类中的循环,你可以想象成为要举行5场比赛,每场比赛的场地就是体育馆
通过执行结果可以看出,在这个对象池(HashMap)中,一直都只有一个对象存在,第一次使用的时候创建对象,之后的每次调用都用的是那个对象,不会再重新创建。
其实在Java中就存在这种类型的实例:String。
Java中将String类定义为final(不可改变的),JVM中字符串一般保存在字符串常量池中,这个字符串常量池在jdk 6.0以前是位于常量池中,位于永久代,而在JDK 7.0中,JVM将其从永久代拿出来放置于堆中。
我们使用如下代码定义的两个字符串指向的其实是同一个字符串常量池中的字符串值。String s1 = "abc"; String s2 = "abc";
如果我们以s1==s2进行比较的话所得结果为:true,因为s1和s2保存的是字符串常量池中的同一个字符串地址。这就类似于我们今天所讲述的享元模式,字符串一旦定义之后就可以被共享使用,因为他们是不可改变的,同时被多处调用也不会存在任何隐患。四、使用场景
当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空间。
在JDK中整型的包装类型内部就都使用了享元模式,Byte、Short、Integer、Long内部均对-128~127的值缓存起来,共享使用。
更常见的是Java中的各种池:数据库连接池、线程池等,也是这个思想。
外媒评选的2021年十项最佳手机,结果很意外,国产手机仅一款入选今天的智能手机都具有令人难以置信的移动体验,可帮助您在远离办公室现场以及任何地方完成工作或者休闲娱乐。当然,人们对手机也有了更高的要求。有些智能手机在摄影方面表现出色,有些手机可以
金蝶用友,舞剑SaaS配图来自Canva可画在百花齐放的ERP(企业资源管理)市场,一直有这样一个说法叫南金蝶,北用友。金蝶指的就是总部定在深圳的金蝶国际,用友指的是地处北京的用友网络,从这句略带江湖气
终于有人把Docker讲清楚了,Docker入门教程,原来这么简单Docker是一个使用Go语言开发的开源的应用容器引擎,让开发者可以打包他们的应用以及依赖到一个可移植的容器中,然后发布到任何流行的机器上。Docker的迅猛发展和全新理念,席卷了
新骁龙8发布后饱受关注,全新5G基带和GPU,各方面体验升级不久前,高通正式宣布骁龙品牌正式独立,吸引了许多人的目光。高通骁龙是大家非常熟悉的叫法,为何高通要把骁龙独立出来呢?这也引起了大众的许多讨论。实际上,高通如今的骁龙芯片已经不局限于
国芯科技IPO注册成功助力高端芯片国产化替代2021年12月7日,证监会发布消息,其按法定程序同意苏州国芯科技股份有限公司(以下简称国芯科技)科创板首次公开发行股票注册。根据招股书显示,国芯科技是一家聚焦于国产自主可控嵌入式
2021年12月29日雷军回应小米对标苹果遭冷嘲热讽信号自拍等遥遥领先12月28日,小米正式发布小米12系列手机。其中,小米12为小屏旗舰,6。28英寸,售价3699元起小米12Pro为6。73英寸大屏
支付宝相互宝关停,监管不背这个锅作为最早加入相互宝的一批用户,相互宝如今这个结局,只能用一句话,一切都是最好的安排,但监管肯定不能背这个锅!当初加入相互宝,最主要的原因就是想看看,这场伟大的社会实践会是怎样的发展
苹果将在2023年为iPhone取消SIM卡槽最近,据外媒的爆料消息,苹果将在2023年推出的iPhone上取消实体SIM卡槽设计,成为首款完全采用eSIM的无实体SIM卡机型。苹果在iPhoneXS系列中采用了双卡双待设计,
机构预测未来三年增速最高的数字经济核心龙头股十四五国家信息化规划发布本次国家信息规划数字经济被重点提及,今后三年将进入快速增长期。数字经济包括了四个角度,分别是数字产业化产业数字化数字化治理和数据价值化。从根本的业绩来看机构
一部手机最多能用几年?现代人对手机的依赖程度也越来越高,已经是我们必不可少的物品。现在手机更新换代的频率也越开越快了,正常使用手机的话,多久更换一款手机才算耐用呢?其实一部手机最多能用几年?这是没有一个
韬光养晦!大陆资本豪掷93亿拿下半导体巨头,下个会是台积电吗?张汝京半导体领域某些方面我们中国是很强的,就好比测试封装这一块。此前被人们冠以中国半导体之父的张汝京在一次采访中谈起了国产芯片的发展现状,结合了当下的国内半导体行业的各个生产环节给