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

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

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

北京急用钱个人贷款(北京私人放款联系方式)3月16日,中关村银行正式入驻北京市贷款服务中心。北京市贷款服务中心是由北京市政务服务局会同北京银保监局北京市金融监管局人民银行营业管理部共同建设,旨在有针对性的解决小微企业的融资2岁去哪里网贷(18岁什么网贷能通过)目前市面上的网络贷款五花八门,在网上经常可以看类似百分之百下款,无需查征信,黑户可以贷款的广告。这使那些有借款需求但个人资质较差的用户仿佛看到了救命稻草,但是面对这样的平台人们还是美白面膜推荐(16款好用面膜大推荐)美白面膜推荐(16款好用面膜大推荐)几乎每个夏天都离不开美白补水的面膜,因为夏天容易被晒黑和缺水,所以怎么能离得开补水快美白好的面膜呢?那么真正有效的美白补水面膜有哪些?你可能不知韩国哪个面膜好(韩国美白面膜哪个好)几乎每个夏天都离不开美白补水的面膜,因为夏天容易被晒黑和缺水,所以怎么能离得开补水快美白好的面膜呢?那么真正有效的美白补水面膜有哪些?你可能不知道,虽然市面上美白补水的面膜不少,但哪款睡眠面膜好用?(睡眠面膜哪个好用)哪款睡眠面膜好用?(睡眠面膜哪个好用)有些时候,我们累得不想进行日常保养步骤,又害怕第二天肌肤会变得暗哑干燥!以下为大家精选了几款睡眠面膜,省去平日繁复的保养程序之余,一觉醒来后肌睡眠面膜推荐(最好用的睡眠面膜排行推荐)睡眠面膜推荐(最好用的睡眠面膜排行推荐)1盛田屋豆乳睡眠面膜买它的原因可能有一大半是因为讨喜的质地,完美地伪装成酸奶或是乳酪,流动性不强,但味道是甜甜的娃哈哈味,还挺出人意料的。一睡眠面膜有效果吗(睡眠面膜哪个效果好)睡眠面膜有效果吗(睡眠面膜哪个效果好)睡眠面膜在近几年时间逐渐越来越火,相比较普通的贴片面膜,睡眠面膜的使用更加方便,并且不需要等待时间,也不需要清洗,特别适合没时间护肤的人,那么螃蟹怎么清洗(螃蟹不洗直接煮吃了会怎样)怎么煮螃蟹食材螃蟹2只姜2克小葱2根调味料料酒2克盐1克方法一用汤锅煮螃蟹1。螃蟹用牙刷,刷洗蟹钳,姜切片。2。汤锅中放入姜片料酒螃蟹小葱盐,倒入清水没过食材。3。加盖焖煮,水沸后瘦身小窍门(掌握3个减肥小技巧)瘦身小窍门(掌握3个减肥小技巧)你不必阅读数以千计的减肥指南来找到减肥的最佳秘诀。无数注册营养师医生健身教练和营养专家分享了最明智的饮食建议。事实上,已被证明有效的减肥计划有一些共欧泊莱护肤品怎么样(欧珀莱的护肤品使用步骤)当步入40多岁时,由于皮肤的胶原蛋白加速流失,脸上开始下垂并出现皱纹。所以在选用护肤品时,应该要根据自己的肤质需求。那今天就为大家分享五款淡纹紧致的护肤品,来帮助皮肤保持紧致和光滑学生平板电脑推荐高颜值的这款错过要再等一年台式机笨重,而学习时笔记本电脑又显得不那么灵活,那么平板电脑绝对是学习生活中的MVP,一款优秀的平板电脑能够大大提升学习效率,目前市面上的平板电脑鱼龙混杂,很多小伙伴不知道怎么去选
十二猴子为什么被禁(钻石局为什么禁猴子)一个游戏发展成熟的时候都需要一个高端玩家的单独平台,比如fps游戏就有各种高端对战平台,还有英雄联盟里的峡谷之巅,这些就是为了满足那些高段玩家对战,也缓解了低端玩家被高端玩家玩小号王者荣耀怎么上星耀(星耀局如何顺利打上王者)打了很多的赛季,相信很多人还是会卡在星耀一,打排位时,特别是晋级赛时,对面总是出奇的强,我方战绩则是不忍直视,最终只能看着王者段位,望洋兴叹。到底是自己靠实力打上去,还是凭小技巧上王者荣耀为什么卡(王者荣耀怎么获得改名卡)王者荣耀近期活动很多,也不知道怎么得的,不少玩家突然就发现手中多出了几张改名卡。但是有很多人会烦恼,究竟取什么名字能更适合自己,在欢乐的峡谷竞赛中吸引别人的眼球呢?不用担心,游戏日ig是什么意思(朋友圈ig是什么梗)快讯彩花漫天飘落,随着IG战队成员举起象征比赛最高荣誉的召唤师奖杯,英雄联盟的S8世界总决赛在韩国仁川落下帷幕。为了这一天,中国赛区已经拼了8年了。IG的夺冠不仅创造了自己的历史,dnf为什么老是网络中断(dnf一登录就网络连接中断)众所周知DNF这游戏是个非常神奇的存在,就算是这游戏的缺点非常的多,总是被玩家们所吐槽。但是不可否认,就是这么一款2D游戏统治了网游界十几年,直到现在还没有其他游戏能取代他的地位。快手为什么打不开(快手闪退怎么解决方法)欢迎转载,请注明出处,抄袭必究!正一边啃零食一边追剧追得正嗨,视频APP突然闪退了聊天正聊得开心呢,突然闪退了最痛苦的莫过于玩游戏正在团战或准备吃鸡,突然闪退了!!!手机应用软件闪pp越狱助手教程(PP越狱助手纯净安全)pp越狱助手教程(PP越狱助手纯净安全)昨天下午,国内越狱团队发布iOS8。3越狱工具,被困守了2个多月的果粉终于得到解脱,这其中就包括了很多刚入手iPhone6的用户。由于4月份爱奇艺怎么发弹幕(爱奇艺弹幕发不出去)弹幕源自日本,在弹幕视频中,用户能让自己的评论实时的出现在视频之中,达到一边观看视频,并同步发表评论的效果,满足用户即时吐槽的需求。8月7日,爱奇艺在8部剧集中开启了弹幕功能,作为爱奇艺怎么解绑手机号(爱奇艺账号取消绑定手机)想必机友们之前都碰到过这种情况明明开通了腾讯视频爱奇艺等视频平台的VIP会员,但在看剧看电影时还是会有广告。机哥看到,有网友足足总结了12种广告形式比如说,在正剧前,会看到一段由剧爱奇艺怎么开杜比(爱奇艺没有杜比视界)近日,爱奇艺在微软应用商店上线新版本应用,成为国内首家在PC端上线杜比视界(DolbyVision)HDR画质内容的视频平台。爱奇艺VIP会员可通过支持杜比视界的笔记本电脑在爱奇艺冬季美容养颜汤(女人多喝4款美容汤)冬季美容养颜汤(女人多喝4款美容汤)前天有位叫SoulRIse的哈友在评论区向哈妹点餐,要求哈妹做几款冬季美容养生汤,哈妹当然应下了,我备选了10款适合冬天喝的美容汤,最终又从中选