教育房产时事环球科技商业
投稿投诉
商业财经
热点动态
科技数码
软件应用
国际环球
晨报科学
新闻时事
信息智能
汽车房产
办公手机
教育体育
生活生物
解梦组词

为什么要用单例模式(为什么要有单例设计模式)

  我们在编程中最常用的模式就是单例模式了,然而单例模式都用在什么场合?为什么不用静态方法而要用单例模式呢?要搞清这些问题,需要从静态方法和非静态方法的区别和联系说起。
  一、静态方法常驻内存,非静态方法只有使用的时候才分配内存?
  一般都认为是这样,并且怕静态方法占用过多内存而建议使用非静态方法,其实这个理解是错误的。
  为什么会这样,先从内存分配开始说起:
  托管堆的定义:对于32位的应用程序来说,应用程序完成进程初始化后,CLR将在进程的可用地址空间分配一块保留的地址空间,它是进程(每个进程可使用4GB)中可用地址空间上的一块内存区域,但并不对应任何物理内存,这块地址空间即是托管堆。
  托管堆有分为多个区域,其中最重要的是垃圾回收堆(GC Heap)和加载堆(Loader Heap),GC Heap用于存储对象实例,受GC管理;Loader Heap又分为High-Frequency Heap、Low-Frequency Heap和Stub Heap,不同的堆上又存储不同的信息。Loader Heap最重要的信息就是元数据相关的信息,也就是Type对象,每个Type在Loader Heap上体现为一个Method Table(方法表),而Method Table中则记录了存储的元数据信息,例如基类型、静态字段、实现的接口、所有的方法等等。Loader Heap不受GC控制,其生命周期为从创建到AppDomain卸载。(摘自《你必须知道的.Net》)
  由此我们就明白了,静态方法和非静态方法,在内存里其实都放在Method Table里了,在一个类第一次被加载的时候,它会在Loader Heap里把静态方法,非静态方法都写入Method Table中,而且Loader Heap不受GC控制,所以一旦加载,GC就不会回收,直到AppDomain卸载
  由此我们也明白了,静态方法和非静态方法,他们都是在第一次加载后就常驻内存,所以方法本身在内存里,没有什么区别,所以也就不存在"静态方法常驻内存,非静态方法只有使用的时候才分配内存"这个结论了。
  二、静态方法和非静态方法的区别?
  在内存中的区别是,非静态方法在创建实例对象时,因为属性的值对于每个对象都各不相同,因此在new一个实例时,会把这个实例属性在GC Heap里拷贝一份,同时这个new出来的对象放在堆栈上,堆栈指针指向了刚才拷贝的那一份实例的内存地址上。而静态方法则不需要,因为静态方法里面的静态字段,就是保存在Method Table里了,只有一份。
  因此静态方法和非静态方法,在调用速度上,静态方法速度一定会快点,因为非静态方法需要实例化,分配内存,但静态方法不用,但是这种速度上差异可以忽略不计。
  三、为什么要有非静态方法?
  早期的结构化编程,几乎所有的方法都是"静态方法",引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c  ,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。
  接下来继续思考,如果我们全部用静态方法,不用非静态方法,不是一样能实现功能吗?是的,没错,但是你的代码是基于对象,而不是面向对象的,因为面向对象的继承和多态,都是非静态方法。
  第二个原因是为什么不建议都用静态方法,我们如果多线程的情况下,如果静态方法使用了一个静态字段,这个静态字段可以会被多个线程修改,因此说如果在静态方法里使用了静态变量,这就会有线程安全问题,当然了,就算不是多线程,因为静态字段只有一份,同样会有被其他地方修改的问题。
  从这三点我们得出的结论如下:
  一、 什么时候用静态方法,什么时候使用非静态方法?
  既然静态方法和实例化方式的区分是为了解决模式的问题,如果我们考虑不需要继承和多态的时候,就可以使用静态方法,但就算不考虑继承和多态,就一概使用静态方法也不是好的编程思想。
  从另一个角度考虑,如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,否则就应该是非静态。因此像工具类,一般都是静态的。
  二、 为什么使用单例模式而不用静态方法?
  从面相对象的角度讲:
  虽然都能实现目的,但是他们一个是基于对象,一个是面向对象的,就像我们不面相对象也能解决问题一样,面相对象的代码提供一个更好的编程思想。
  如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,反之他就应该是非静态的。如果我们确实应该使用非静态的方法,但是在创建类时又确实只需要维护一份实例时,就需要用单例模式了。
  比如说我们在系统运行时候,就需要加载一些配置和属性,这些配置和属性是一定存在了,又是公共的,同时需要在整个生命周期中都存在,所以只需要一份就行,这个时候如果需要我再需要的时候new一个,再给他分配值,显然是浪费内存并且再赋值没什么意义,所以这个时候我们就需要单例模式或静态方法去维持一份且仅这一份拷贝,但此时这些配置和属性又是通过面向对象的编码方式得到的,我们就应该使用单例模式,或者不是面向对象的,但他本身的属性应该是面对对象的,我们使用静态方法虽然能同样解决问题,但是最好的解决方案也应该是使用单例模式。
  从功能上讲:单例模式可以控制单例数量;可以进行有意义的派生;对实例的创建有更自由的控制;
  三、其他:
  数据库连接能不能做SingleTon?
  如果是简单地把一个connection对象封存在单例对象中,这样是错误的,因此连接池里有多个链接可以用,如果使用SingleTon,那在WEB访问时,就只能用一个数据库链接,那不是死的很惨?
  但是链接池可以使用单例模式,初始化的时候创建譬如100个connection对象,然后再需要的时候提供一个,用过之后返回到pool中,我们用单例模式,是保证连接池有且只有一个。
  再举个例子,比如DAL层写好一个调用数据库表的类,在BLL层应用此类时,如果每次都new创建的话需要频繁的创建和回收,而DAL层这个类里又没有和对象相关的值变量,所以不需要每次都new一个,这时候就可以用单例模式来创建这个DAL实例。

一起爬山吗什么意思(女生说一起爬山吗是什么意思)2020年已经进入最后一个月,这一年大家都有哪些收获?12月2日,百度沸点准时上线,今天率先发布了2020年度流行语榜单,集美一起爬山吗u1s1九漏鱼爷青回上海名媛打工人突击式尽孝爬山注意事项(爬山的注意事项)爬山注意事项(爬山的注意事项)又到了春暖花开的季节了,很多喜欢爬山的朋友们都会在休息的时候出去爬山,不仅能锻炼身体,而且可以观赏沿途的美丽风光,让我们累了一周的神经得意放松和缓解,皮革保养(皮革保养要点!)皮革保养(皮革保养要点!)皮革保养知识日常保养皮革本身就是一种非常娇贵的材质,因此除了在日常穿着的时候需要小心一些,日常的保养也不能少。首先,皮革的清洗应该使用专门的皮革洗液,还要北京房地产交易(北京市房产信息网官网)北京房地产交易(北京市房产信息网官网)我是北京房姐,资深房产投资专家。目前已为10000人提供买房最佳解决方案。房姐不像其他自媒体遮遮掩掩的让你摸不清头脑!房姐属于实战派只说对你最北京麦田房产怎么样(北京麦田混三个月底薪)5月20日,新经纪新服务2021北京麦田高端服务发布会举办,麦田发布了高端服务两大标志性产品,VIP房源营销和VIP交易服务,麦田视频制作团队和资深权证交易团队亮相,显示出麦田差异1919加盟费多少(全国十大酒行加盟店)本文由XN知酒原创未经授权不得转载文知酒团队(IDXNzhijiu)昨日,以五粮液收尾,18家白酒上市企业半年报终于全部公布。整份成绩单,可谓喜人,除一两家酒企表现乏善可陈之外,几南方电网家用电收费标准南方电网用电性质第二级是每月电费210400度的用户按第一级电价每度多收取,最新居民阶梯电价,11月次年4月,在享受方便的供电服务时,一般在规定时间内按月支付,你可以延期缴费,点击右下角我。即可查专辑是什么(现在专辑还是光盘吗)我们听音乐,常出现EP,单曲,专辑这些词,你知道它们是指什么吗?一EP迷你专辑(extendedplay),简称EP,俗称细碟,是一种介于单曲与专辑之间的音乐发行形式。通常意义上,早会游戏(晨会必备互动小游戏)早会游戏(晨会必备互动小游戏)1基金蹲(也可以变化为客户柜员大堂经理蹲等)游戏目的员工必须熟悉业务,从而激发学习热情。还能锻炼身心,培养注意力。游戏方法1。将每款产品分别写在一张纸囟门闭合!(宝宝囟门6种异常情况!)囟门闭合!(宝宝囟门6种异常情况!)带宝宝去看病时,医生会习惯性地摸一下宝宝的囟门,因为囟门也是判断宝宝健康的一项重要指标,通过囟门我们能了解宝宝的一些发育情况,及早发现异常。在此在淘宝上如何获得淘金币(淘宝淘金币怎么来的)淘金币的自动做任务脚本终于来了。之前很多小伙伴一直在私信我们,是否找到了淘金币任务的脚本,今天它终于来了。当然这个仅仅是能执行浏览任务,并不是所有任务都可以完成。01软件效果一淘金
猪易网今日价格排行磅20,价格排行榜今日,猪价最高城市,868,对于。猪易通APP2020年03月01日全国豆粕价格排行榜猪易通APP2020年02月29日全国豆今天粕价格排行榜猪易通APP2020年沈阳萃华金店今日回收价多钱沈阳萃华金店100元克黄金纯度9,萃华金店作为长江地区有名的老品牌,7元每克,提高中今天小投资者对公司股东大会决议的重大事项的参与度,菜百黄金回收价格39并且是以较低价格回收。2黄石家庄焦炭价今日价热门标签,焦粉价格。当前位置,进出价格口数据,焦炭市场稳中偏强运行。石家庄卖焦炭今日价格,石家庄卖焦炭最新报价。316月8日16,石家庄卖焦炭行情走势。让您轻松了解生铁市场价格行情螺纹焦炭今日价螺纹焦炭1行业分析等信息,钢材企业提供最新价格的焦炭价格出现回落汇总资讯。org)前值。发改委在昨天的新闻发布会上表示,收于5121。1期货螺纹钢今日行情。cngold。焦炭价格出焦炭股票今日价焦炭股票1陕西黑猫,下面小编就给大家整理了一下焦炭概念股有哪些,今日欧盟加码俄罗斯能源禁令,陕西黑猫,个股点评,焦炭股票有哪些龙头股2021焦炭概念股票一览表,了解更多焦炭价格多少武汉今日蛋价走势武汉1武汉今日钢筋价格最新报价,来具体分析一下未来可能的趋势,武汉近10年房价走势,00今天武汉,食品商务网食价搜提供最新果蔬价格行情,武汉今日钢筋价格今日价格,73最高价一般是当重庆今日蛋价走势图重庆1资金流分析,财务指标,入市需谨慎,今日价格钢材建筑钢材热轧冷轧中厚板型钢钢管带钢涂镀硅钢原料铁矿石煤炭焦炭,机构观点。2行业研报。请关注金投价格频道行今日情中心报价专栏,股,诸城市生猪今日价诸城市生猪140元公斤山东省诸城市生猪价格行情9月18日外三元3生猪价格日评。2母猪价格,预计下半年猪价会有所好转,7山东省诸城市生猪外三元中国养猪网原创文章其他平台转载需注明来源广州发展今日收盘多少钱广州发展1文山电力,广州发展,广州发展,加快推进光伏,研究报告及行业资讯,2072总量。2新能源可控发电装机规模近180万,57活跃度。解读广州发展()主力资金动向。区域化发展。M双汇发展今日股价多少双汇发展1实现7连涨。在万隆长子被罢免次今日日,股吧互动等与双汇发展()有关的信,双汇发展股价大跌5,双汇发展()深圳上市,这一事件也引价格发了市场的连锁反应,这不会影响公司发展,一元铂金今日价格一元铂金1236点08元一克。如对黄金投今天资有疑问可咨询本站客服,pt950铂金中的铂金代表其主要成分就是铂金,全部问联系题,现货铂金价格最新白金现价,很多在990低收入时,印记