范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

设计模式享元模式解决重复对象的内存浪费问题

  一、定义
  "享元"指被共享的单元。享元模式就是通过复用对象,以达到节省内存的目的。
  尝试复用现有的同类对象,如果未找到匹配的对象,则创建新对象。
  意图:运用共享技术有效地支持大量细粒度的对象。
  主要解决:在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。 二、内部状态和外部状态
  享元模式提出了两个要求: 细粒度和共享对象。这里涉及到内部状态和外部状态,即将对象的信息分为两个部分:内部状态和外部状态。
  内部状态指对象共享出来的信息,存储在享元对象内部且不会随环境的改变而改变
  外部状态指对象得以依赖的一个标记,是随环境改变而改变的、不可共享的状态
  以围棋为例,围棋只有黑白二色,其颜色不会随环境改变而改变,所以围棋颜色就是围棋的内部状态,可共享;棋子之间的差别在于位置不同,而落子后,棋子的位置会发生变化,所以棋子的坐标是棋子的外部状态,不可共享。 三、享元模式原理类图
  (1)抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
  (2)具体享元角色(Concrete Flyweight):实现抽象享元角色中所规定的接口。
  (3)非享元角色(Unsharable Flyweight) :是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
  (4)享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检查系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。四、案例
  以网站项目展示为例,有的要求以新闻形式发布,有的要求以博客形式发布,有的要求以 微信公众号形式发布。
  整合到一个网站中,共享其相关的代码和数据,对于硬盘、内存、CPU、数据库空间等服务器资源都可以达成共享,减少服务器资源。
  //抽象享元角色 public abstract class WebSite {     public abstract void use(User user); }  //具体享元角色 public class ConcreteWebSite extends WebSite {     private String type = "";//网站发布形式,内部状态,共享部分       public ConcreteWebSite(String type) {         this.type = type;     }       @Override     public void use(User user) {         System.out.println("网站的发布形式为:"+type+","+user.getName()+"在使用");     } }  //非享元角色 public class User {     private String name;       public User(String name) {         this.name = name;     }       public String getName() {         return name;     }       public void setName(String name) {         this.name = name;     } }  //享元工厂 public class WebSiteFactory {     //集合,充当池的作用     private HashMap pool = new HashMap<>();       //根据网站类型,返回一个网站,如果没有就创建一个并放入池中     public WebSite getWebSiteCategory(String type){         if(!pool.containsKey(type)){             pool.put(type,new ConcreteWebSite(type));         }         return pool.get(type);     }       //获取网站分类数     public int getWebSiteCount(){         return pool.size();     }   }  //客户端 public class Client {     public static void main(String[] args) {         //创建一个工程类         WebSiteFactory webSiteFactory = new WebSiteFactory();           //A以一个新闻形式发布网站         WebSite newsWebsite = webSiteFactory.getWebSiteCategory("新闻");         newsWebsite.use(new User("A"));         //B以一个博客形式发布网站         WebSite blogWebsite1 = webSiteFactory.getWebSiteCategory("博客");         blogWebsite1.use(new User("B"));         //C以一个博客形式发布网站         WebSite blogWebsite2 = webSiteFactory.getWebSiteCategory("博客");         blogWebsite2.use(new User("C"));         //D以一个博客形式发布网站         WebSite blogWebsite3 = webSiteFactory.getWebSiteCategory("博客");         blogWebsite3.use(new User("D"));           //实际网站发布分类实例         System.out.println("实际网站发布分类实例:"+webSiteFactory.getWebSiteCount());       } } 五、应用
  在Java Integer的实现中,-128到127之间的整型对象会被事先创建好,缓存在IntegerCache类中。当我们使用自动装箱或者valueOf()来创建这个数值区间的整型对象时,会复用IntegerCache类事先创建好的对象。这里的IntegerCache类就是享元工厂类,事先创建好的整型对象就是享元对象。
  在Java String类的实现中,JVM开辟一块存储区专门存储字符串常量,这块存储区叫作字符串常量池,类似于Integer中的IntegerCache。不过,跟IntegerCache不同的是,它并非事先创建好需要共享的对象,而是在程序的运行期间,根据需要来创建和缓存字符串常量。

新赛季恐寝食难安的八大球星,勇士忍痛割爱,爵士不破不立天下熙熙,皆为利来,天下攘攘,皆为利往。在物欲横流的商业联盟时代,球员之间的交易,早已成为司空见惯的常态。从年轻的落选秀传奇伍德再到爵士双煞,自由市场上从来不缺少年轻亦或者顶级球星美媒对西部15支球队2223赛季的实力进行排名勇士第一湖人第八距离202223赛季的NBA赛季开始还有不到一周的时间,西部金州勇士和洛杉矶湖人都是联盟最受欢迎的球队之一。因此,美媒FadeawayWorld也是对西部15支球队202223赛季克莱格林复出!勇士被逆转以112119不敌掘金本场比赛最大的看点是格林和普洱两人的关系!不过他俩今天场上居然有互动了,这是没事了?克莱本赛季首次代表球队出战季前赛,回归首球就是接追梦助攻三分命中!而且接连命中三分手感火热,比赛王海旭忠诚拼搏锻造过硬实力王海旭在演训中。田越洋摄(新华社发)子夜,一场多军兵种检验性对抗演练拉开帷幕。驻香港部队某部分队装备车辆集结编队,迅速抢占阵地做好战斗准备。听着作战参谋的报告,分队长王海旭紧盯着雷我超,iPhone15!也许是手机里面最漂亮的刘海?魅族X8测评不得不说,魅族尽管目前已经半死不活,但是在很多的方面,确实是遥遥领先。比如小刘海和小水滴的设计,对于魅族note9那个小水滴的设计我确实是难以认同,小的水滴反而看着更加碍眼了,但是全红禅换新发型!恩师陈若琳操刀,出征跳水世界杯,或解锁大满贯头条创作挑战赛距离2022年德国柏林跳水世界杯只剩下最后的5天时间,世界各国跳水队都将在近日启程前往德国,准备参加这个跳水运动最高级别单项赛事。就在近日,咱们中国跳水梦之队内人气最世界杯首支出线队诞生!德国60造超级惨案,中国女足拿6分晋级U17女足世界杯第二轮小组赛全面开打,夺冠热门德国女足踢出一场大比分胜利,最终60狂胜智利女足,提前一轮锁定小组前二,成为本届世界杯首支出线的球队。中国女足将在10月15日晚7点对卫冕冠军遭打击!曝法国铁腰因伤无缘世界杯,后防线恐失两大屏障法国中场坎特的伤势恢复情况不容乐观,他将会缺席11月在卡塔尔开幕的世界杯。自从8月14日英超第二个比赛日过后,坎特就因为腘绳肌受伤没有再为切尔西出场。如今看来,他的恢复期恐怕还将延连赢5局,王曦雨20击败西班牙名将,挺进纳波卡站女单四强北京时间10月15日凌晨,WTA250克卢日纳波卡赛女单四强出炉,中国金花王曦雨表现出色,凭借第一盘的连赢5局和第二盘的连赢4局,20击败了西班牙名将迪亚斯,昂首挺进四强。这是王曦世界杯奖杯已经准备好了,纯手工打造国际足联世界杯将在不寻常的时间和不寻常的地方举行。然而,所有球迷的注意力都会被引向一个常见的问题谁将拿下世界杯?距离卡塔尔锦标赛开始还有一个多月,珍贵的杯子已经准备就绪。该奖项在位U17女足迎战哥伦比亚,有望杀出重围闯入八强10月15日晚U17世界杯中国迎来第二个对手哥伦比亚队。哥伦比亚无论技术节奏还是对抗都远远强于我们,想胜利也是非常困难,但是我们的小花非常有韧性和拼劲,上场对阵墨西哥这只世界亚军球
18年征途,追寻中国探月之旅访嫦娥五号探测器副总设计师张洪华来源人民周刊昔有嫦娥奔月,今有中国探月。上古的神话传说,在本世纪初成为现实,中国的探月工程在2004年正式立项。古老的中华文明在今朝跨越时空接力前行,18年来的一系列嫦娥工程为您揭NASA局长妄称中国打着科研幌子上月球,是为了占领月球文李海军新年的第一天,美国就有人对华放炮,1月1日,美国国家航空航天局(NASA)局长比尔尼尔森对媒体称中美正处于一场太空竞赛,我们最好小心,不要让他们打着科学研究的幌子抵达月球上90后情侣骑摩托环游中国!花光积蓄后,靠着贷款走完三条边境公路这是走吧网推送的第274个与众不同的旅者故事本期嘉宾安娜安娜,90后川妹子,四川德阳人,19岁开始徒步搭车背包旅行21省,骑自行车跨越过5省,和男友骑着一辆150cc的小摩托环游中中国古代三大侍寝方法,发明者都是千古一帝中国古代三大侍寝方法,发明者都是千古一帝,做法却一个比一个离谱,让后宫嫔妃苦不堪言,那这三种侍寝方式究竟是啥?又为什么说它们奇葩至极呢?皇帝作为古代封建时期至高无上的存在,拥有众多中国高校108吉林省曾经有所电影学院,比肩北影,为啥黄了?长春有新中国第一个电影制片厂,为啥没有电影大学呢?其实,吉林省曾经有一所电影学院,不过后来黄了。这是为什么呢?今天,每日汉字就和大家聊聊这所学校。长春市是有电影基础的。1937年,古代仗打太多没钱怎么办,浅谈汉武帝时期的新财经政策如果您喜欢这篇作品,欢迎点击右上方关注。感谢您的鼓励与支持,希望能给您带来舒适的阅读体验。汉武帝刘彻是历史上颇受争议的皇帝,他的性格特点十分明显,既有雄才大略,具备高超的政治素养和特斯拉挥出七伤拳,屠刀砍向蔚小理作者闫学功封面来源摄图网2023年第一个周五(1月6日),特斯拉官宣大降价,主力车型最高直降4。8万元。看似平静的中国车市,瞬间被这枚重磅炸弹炸开了锅。第二天,有特斯拉车主在门店拉数字人民币扩围数字人民币规模化试点应用已悄然开启。近日,国际金融报记者了解到,继支付巨头入网试点城市扩围推出专属头像之后,在兔年新春来临之际,全国试点地区的消费者可用数字人民币发拜年红包置办年货美股笑迎CPI!纳指涨1。763B家居涨68。6中新经纬1月12日电美股周三高开高走,纳指连续第四个交易日上涨。美国家居零售巨头3B家居涨68。6,据路透社报道,部分投资者猜测该公司可能成为潜在收购目标,该公司股价前一日收涨27昔日网红,也慌了!作者飞天小女警曾经盲盒开盘自信满满的沙井海岸城,如今也慌了。这几天可以看到,尽管是西部超级网红小区,也要放下身段,大力安排营销。比如第一次开盘提供样板间第一次登记期间发布意向登记人外资巨头大手笔增持美团中国基金报记者赵心怡据港交所1月11日公布的文件显示,摩根大通在1月5日增持约4047万股美团W(3690。HK),平均增持价格为每股190。3392港元,持股比例上升至5。21。