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

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

  我们在编程中最常用的模式就是单例模式了,然而单例模式都用在什么场合?为什么不用静态方法而要用单例模式呢?要搞清这些问题,需要从静态方法和非静态方法的区别和联系说起。
  一、静态方法常驻内存,非静态方法只有使用的时候才分配内存?
  一般都认为是这样,并且怕静态方法占用过多内存而建议使用非静态方法,其实这个理解是错误的。
  为什么会这样,先从内存分配开始说起:
  托管堆的定义:对于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实例。

本命年发朋友圈的说说近日本命年发朋友圈的说说登录上了百度热搜,受到广大网友们的关注,那么关于目前的本命年发朋友圈的说说相信小伙伴们都是想要了解到最新的信息吧,小编也是在网上进行了一些整理,收集到了一些粽子包法(粽子的包法三角形)粽子包法(粽子的包法三角形)时间过的可真快,若不是有朋友问我粽子怎么包,我都忘了马上快到端午节了。粽子,最早我也喜欢买现成的,从超市里买几个回家,放到电饭锅里煮一下,就图个省事。后粽子的包法视频(枕头粽子的包法图解)粽子的包法视频(枕头粽子的包法图解)端午马上就要到了,大家要是想买粽子的话,最好提前购买,要不到了端午节当天,肯定会涨价不少。不过对于我来讲,就没有这种顾虑了,因为我要自己在家包粽如何做粽子(包粽子的简单步骤)2种包粽子最简单方法,步骤讲解很详细,一卷一盖就会,赶紧收藏端午节到了,不知道你家里有没有开始包粽子,这不昨天上街去买菜的时候,就买了100张的粽子叶。打算今天给家里包上一锅粽子,合肥凌晨命案一男一女身亡具体发生了什么事近日合肥凌晨命案一男一女身亡登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下合肥凌晨10吨猪肉翻车遭哄抢市委致歉具体发生了什么事?ldquo10吨猪肉在江苏盐城东台市境内因翻车遭哄抢rdquo的消息近日引起舆论关注。东台市委宣传部8月10日通过网络平台致歉。近日在微博发文称自己ldquo拉了十吨猪肉,车子在高南京女子14秒暴打司机21次具体发生了什么事近日南京女子14秒暴打司机21次登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下南京24岁抗洪牺牲消防员赵丹被评烈士具体发生了什么事近日24岁抗洪牺牲消防员赵丹被评烈士登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下辽宁虎谷峡玻璃栈道发生事故具体发生了什么事近日辽宁虎谷峡玻璃栈道发生事故登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下辽宁虎椰树集团就招聘信息致歉具体发生了什么事?椰树集团官网发布声明致歉称由于对招聘信息审核不严,用词不当,部分条款已违反劳动合同法相关规定以及人文精神,造成不良影响,椰树集团在此向社会大众深表歉意。附声明全文如下昨日,椰树集团高职高考作文(高考作文万能模板)高职高考作文(高考作文万能模板)2021届海淀区一模1933年,29岁的郑大章获得法国国家理化博士学位后,拒绝了导师居里夫人的挽留,回国筹建镭学研究所,筚路蓝缕,成为中国放射化学的
创驰蓝天技术是什么(马自达蓝天创驰技术是哪一款)下面这则消息略硬核,应该是马自达粉丝们愿意看的。具体消息是这样。马自达MX30相信大家都有所耳闻吧,原本这款车是马自达旗下首款纯电动车,但它的续航能力很差,主要是电池组容量太小。后蓝天救援队怎么加入(救援队靠什么收入)蓝天救援队我们在等优秀的你为需要帮助的人贡献自己力所能及的力量蓝天救援救在身边关于我们本着人道博爱奉献的志愿精神,遵循少说多做默默奉献完善自我善待他人的蓝天救援队训。南康蓝天救援队胚芽发育成什么(胚可以发育成什么)生物学家生物学家是从事以生命为研究对象工作的科学家,要了解生物学家就需要了解生物学,大家都学过生物学,自己可以想想自己对生物学的理解有多少。生是生命,物是物体,生物就是有生命的物体鸿门宴是什么意思(历史典故鸿门宴)鸿门宴是什么意思(历史典故鸿门宴)鸿门宴,指公元前206年,于秦朝都城咸阳郊外的鸿门(今陕西省西安市临潼区新丰镇鸿门堡村)举行的一次宴会,参与者包括当时两支抗秦军的领袖项羽及刘邦。鸿门宴是什么意思(女生说鸿门宴啥意思)秦末年间,宦官赵高掌握朝政,对着秦二世指鹿为马,搞得百姓民不聊生,各地势力纷纷揭竿而起。其中最强的末过于楚霸王项羽和汉高祖刘邦,项羽在和各路诸侯一起推翻秦朝之后,天下约定,谁先入主性情男女(性情男女话剧中心思想)性情男女(性情男女话剧中心思想)4月7日,由谷智鑫程莉莎张培等原班人马主演的话剧性情男女将重返北京人艺实验剧场,与观众见面。阔别十二年,四位主演各有独特人生阅历,程莉莎更是感慨万千公司注销需要多久(注销营业执照需要多久?)公司注销需要多久(注销营业执照需要多久?)注销营业执照需要多久?公司注销流程不运营的公司,处理的办法有两种转让或者是注销。准绳上,只需公司能够进行转让,那么就以转让为先,由于办理程吊销未注销是什么意思(有没有人公司被吊销未注销)一什么是注销?简单地说,注销就是公司不开了合法的退出方式。二什么是吊销吊销是公司被动退出市场的一种方式。企业容易被吊销的情况有长期不进行纳税申报,长期不进行工商年报,或者违反工商行滴滴不注销有什么后果(公司怎么注销)今年我的车险快到期了,今天去太平洋保险公司续保。车子七年了,一直都是在这家公司保险,也没出过险,等工作人员提交后,系统拒保我的商业车险,理由是车联险高风险业务。我不明白就问工作人员公司注销需要哪些资料(注销公司需要什么材料和手续)今日注销案例今天给大家讲的是一个杭州注销的案例反馈哦,这个注销是一个一般注销,但是证件和公司章全部都丢失了,需要公安局备案过证件和章,需要办理登报遗失声明,还要补证件和章。还有人不西华师范大学怎么样(西华大学和西华师范哪个更好)一引言时间过得好快,2021年高考已经结束好长时间了,但想起高考时的场景还历历在目。在近年来的志愿报考中,考生们对师范院校的报考热情比较高,尤其是师范专业的录取分数都比较高。对于四