Java设计模式之享元模式
一、概述
享元模式:享就是分享之意,指一物被众人共享,而这也正是该模式的宗旨所在。
享元模式有点类似于单例模式,都是只生成一个对象来被共享使用。这里有个问题,那就是对共享对象的修改,为了避免出现这种情况,我们将这些对象的公共部分,或者说是不变化的部分抽取出来形成一个对象。这个对象就可以避免修改的问题。
享元的目的是为了减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的对象,以此来降低内存的消耗。二、示例
下面我们来看一个简单的例子:
建筑接口:JianZhupublicinterfaceJianzhu{voiduse();}
体育馆实现类:TiYuGuanpublicclassTiYuGuanimplementsJianzhu{privateStringname;privateStringshape;privateStringyundong;publicTiYuGuan(Stringyundong){this。setYundong(yundong);}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this。namename;}publicStringgetShape(){returnshape;}publicvoidsetShape(Stringshape){this。shapeshape;}publicStringgetYundong(){returnyundong;}publicvoidsetYundong(Stringyundong){this。yundongyundong;}Overridepublicvoiduse(){System。out。println(该ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆被使用来召开奥运会运动为:yundong形状为:shape名称为:name);}}
建筑工厂类:JianZhuFactoryimportjava。util。;publicclassJianZhuFactory{privatestaticfinalMapString,TiYuGuantygsnewHashMapString,TiYuGuan();publicstaticTiYuGuangetTyg(Stringyundong){TiYuGuantygtygs。get(yundong);if(tygnull){tygnewTiYuGuan(yundong);tygs。put(yundong,tyg);}returntyg;}publicstaticintgetSize(){returntygs。size();}}
测试类:ClienterpublicclassClienter{publicstaticvoidmain(String〔〕args){Stringyundong足球;for(inti1;i5;i){TiYuGuantygJianZhuFactory。getTyg(yundong);tyg。setName(中国ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆);tyg。setShape(圆形);tyg。use();System。out。println(对象池中对象数量为:JianZhuFactory。getSize());}}}
执行结果:该ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆被使用来召开奥运会运动为:足球形状为:圆形名称为:中国ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆对象池中对象数量为:1该ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆被使用来召开奥运会运动为:足球形状为:圆形名称为:中国ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆对象池中对象数量为:1该ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆被使用来召开奥运会运动为:足球形状为:圆形名称为:中国ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆对象池中对象数量为:1该ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆被使用来召开奥运会运动为:足球形状为:圆形名称为:中国ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆对象池中对象数量为:1该ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆被使用来召开奥运会运动为:足球形状为:圆形名称为:中国ahrefhttps:www。q578。coml70targetblankclassinfotextkey体育a馆对象池中对象数量为:1三、模式解析
如上示例中,使用工厂模式进行配合,创建对象池,测试类中的循环,你可以想象成为要举行5场比赛,每场比赛的场地就是体育馆
通过执行结果可以看出,在这个对象池(HashMap)中,一直都只有一个对象存在,第一次使用的时候创建对象,之后的每次调用都用的是那个对象,不会再重新创建。
其实在Java中就存在这种类型的实例:String。
Java中将String类定义为final(不可改变的),JVM中字符串一般保存在字符串常量池中,这个字符串常量池在jdk6。0以前是位于常量池中,位于永久代,而在JDK7。0中,JVM将其从永久代拿出来放置于堆中。
我们使用如下代码定义的两个字符串指向的其实是同一个字符串常量池中的字符串值。Strings1abc;Strings2abc;
如果我们以s1s2进行比较的话所得结果为:true,因为s1和s2保存的是字符串常量池中的同一个字符串地址。这就类似于我们今天所讲述的享元模式,字符串一旦定义之后就可以被共享使用,因为他们是不可改变的,同时被多处调用也不会存在任何隐患。四、使用场景
当我们项目中创建很多对象,而且这些对象存在许多相同模块,这时,我们可以将这些相同的模块提取出来采用享元模式生成单一对象,再使用这个对象与之前的诸多对象进行配合使用,这样无疑会节省很多空间。
在JDK中整型的包装类型内部就都使用了享元模式,Byte、Short、Integer、Long内部均对128127的值缓存起来,共享使用。
更常见的是Java中的各种池:数据库连接池、线程池等,也是这个思想。
被传收购魅族,吉利在下一盘什么棋?中新经纬1月25日电(付玉梅)吉利造手机来势汹汹。近日有消息称,吉利集团旗下手机公司星纪时代正与手机厂商魅族接触洽谈收购事宜,目前处于尽职调查阶段。吉利回应中新经纬称,我……
腾讯变了点蓝字关注,不迷路连接超过12亿用户的能力,是腾讯的核心优势。如何围绕这一能力变现,是腾讯每次面对时代转折时的最本质考验。1。0版本的赋能,腾讯应用于自身,将连接能……
发布软文要找些软文营销平台吗?这个真不好回答,因为太多了,而且,每天都在更新。基本上只要在百度上一搜软文发布平台,每天的内容都差异巨大。专业一点好一点的软文推广平台U传播、软文街这些还好,几年了,基本上都保……
中国移动与中国广电牵手共建700M网络中国移动和中国广电官宣牵手,开始共建共享700Mhz频段5G无线接入网。预示着行业内一直传言的中国移动和中国广电的合作正式的靴子落地,中国的5G建设开始了中国移动加中国广电VS……
一加10Pro搭载Pixelworks视觉显示技术让屏幕的显各种亮度下均能保证真实色彩与舒适观感上海2022年1月11日美通社领先的创新视频和显示处理解决方案提供商Pixelworks,Inc。(纳斯达克股票代码:PXLW)逐点半……
有望成最便宜的5G平板?台电T405G版将重新定义性价比5G作为当前消费市场先锋,目前各大厂商先后进入到5G平板市场,首先是小米、荣耀率先布局,后来者居上,如今台电与酷比也将推出5G平板。事实上,台电早在4月份便已经曝光了首款5G平……
元宇宙产业委员会首批成员接纳名单公布中国移动(600941)通信联合会元宇宙产业委员会首批成员接纳名单公布。首批名单从267家申报个人和单位中经合规审核后接纳65家人(个人成员25人,单位成员40家,上市公司8家……
500多项测试全部通过,vivoOriginOS获泰尔实验室随着人们安全保护意识的不断增强,如何更好的守护自己的隐私数据,就成为了大家最关心的事情。目前来看,智能手机已经逐渐取代笔记本和台式机,成为了我们使用频率最高的电子设备,因此拥有……
iPhone13发布,爆料都在这了预计本次发布会将推出iPhone13系列手机,AppleWatchSeries7以及AirPods3等产品。有关iPhone13的性能、配置也有着不少猜测。总结下来,主要……
扎堆9月,国内厂商宣布发布会时间,小米绿厂选择与苹果硬刚2021年的金九,手机圈属实有点热闹。苹果公司正式宣布,北京时间9月15日凌晨1点举行特别活动,所谓的特别活动便是苹果一年一度的秋季发布会,届时iPhone13系列手机将……
可溶解智能手表问世外壳在水中40小时内溶解可溶解智能手表问世外壳在水中40小时内溶解黄显团队研发的可溶解智能手表受访者供图成果播报科技日报讯(记者陈曦通讯员赵晖)当世界钟表行业还在研究如何增强手表的防……
美国50年前登月,但是据说月球早晚温差几百度,宇航员怎么耐受美国当年登月从未在月球度过1个月球日,也就是14个地球日,在月球上停留时间最长的是阿波罗17号,待了72小时,没机会体验月球的早晚温差。月球由于没有大气没有磁场,日光没有……