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

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

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

女性安全期怎么算(女人的安全期怎么算?)女性安全期怎么算(女人的安全期怎么算?)女性在安全期同房受孕几率会比较低,女性要正确计算安全期,月经前七天和后七天称为安全期,危险期同房需要做好避孕措施,否则很容易意外受孕,女性最什么是女性安全期(女性安全期是什么时候?)什么是女性安全期(女性安全期是什么时候?)我们女性对安全期都非常关注,那么女性安全期是什么时候,又要如何计算呢?图片来源于网络,如有侵权请联系删除正常育龄期女性每个月来1次月经,从安全期是哪几天(该如何确定安全期范围呢?)安全期是哪几天(该如何确定安全期范围呢?)安全期避孕是避孕措施的一种,其无需通过外物辅助即能避孕,具有天然无害的优点,因而该避孕方法如今仍受人采用。应用该方法避孕,关键点是准确进行月经多久安全期(经期前3后3是绝对安全期吗)不知道大家对于安全期和危险期有没有什么深入的了解,很多人认为安全期是绝对不会怀孕的,这种想法到底是不是真的?安全期究竟会不会怀孕一直都是女性所的问题,当你和男友or老公啪啪啪时,是死螃蟹可以吃吗(螃蟹死了为啥不能吃?)死螃蟹可以吃吗(螃蟹死了为啥不能吃?)最近是一年一度的大闸蟹季,螃蟹又肥又好吃。可是偶尔不小心买多了,一次性又吃不完,该怎么办?灵魂发问怎么才能让我的大闸蟹别那么快死掉?我想让它多新闻中秋节吃螃蟹的由来近日中秋节吃螃蟹的由来登录上了百度热搜,受到广大网友们的关注,那么关于目前的中秋节吃螃蟹的由来相信小伙伴们都是想要了解到最新的信息吧,小编也是在网上进行了一些整理,收集到了一些与中新闻怎么吃螃蟹不会太寒近日怎么吃螃蟹不会太寒登录上了百度热搜,受到广大网友们的关注,那么关于目前的怎么吃螃蟹不会太寒相信小伙伴们都是想要了解到最新的信息吧,小编也是在网上进行了一些整理,收集到了一些与怎新闻晚上吃螃蟹有什么坏处近日晚上吃螃蟹有什么坏处登录上了百度热搜,受到广大网友们的关注,那么关于目前的晚上吃螃蟹有什么坏处相信小伙伴们都是想要了解到最新的信息吧,小编也是在网上进行了一些整理,收集到了一些新闻吃螃蟹过敏症状近日吃螃蟹过敏症状登录上了百度热搜,受到广大网友们的关注,那么关于目前的吃螃蟹过敏症状相信小伙伴们都是想要了解到最新的信息吧,小编也是在网上进行了一些整理,收集到了一些与吃螃蟹过敏教大家夏天吃西瓜会发胖吗近日有关于教大家夏天吃西瓜会发胖吗的问题受到了很多网友们的关注,大多数网友都想要知道教大家夏天吃西瓜会发胖吗的具体情况,那么关于到教大家夏天吃西瓜会发胖吗的相关信息,小编也是在网上吃月饼会发胖吗近日吃月饼会发胖吗登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下吃月饼会发胖吗具体
今日廉江市场猪肉价格,廉江名人26个点,但因产地养猪人惜售情绪明显。其中。全国今日生猪价格今日广西茶籽价格,屠企提价收猪现象有所增多,白条猪走货压力加大。受市场交易冷清。全国莲藕今天价格表今日滨城区生猪价格表,SUZUKI爱物语你出游我出车拍照上传爱的小语,就有机会免费两天一夜开车约会出游!樱花纷飞2月时节,除了是喜气洋洋的中国农曆新年外,也是一年一度充满浪漫气氛的西洋情人节,源自日本品牌的SUZUKI,本月份呼应情战神引领驾驭激情Nissan公布台北车展展出车单Nissan以全球一贯的SHIFT创新精神,设计创新的产品并不断掀起行动空间的革命本次Nissan以SHIFT精神主轴,在台北车展上规划了激情驾驭人性创新及感性设计等三大区块,除展澳门赌王何鸿(何鸿章和赌王)话说,赌王拿着10块钱坐船到了澳门,为什么在短短的三年之内能起家呢,这正应证了赌王常说的一句话什么都不重要,女人最重要。那就说说,赌王何鸿燊的原配,也是他的起山的支柱黎婉华。年轻时祸不单行什么意思(背影中的祸不单行是什么意思)福无双至,祸不单行的意思就是幸运的事情不会一直到来,但是不好的事情就会接踵而至,还有句俗语人要倒霉了喝口凉水都塞牙。人在生活中某个阶段总会遇到倒霉的事接二连三,相反顺的话好事接种而斩钉截铁是什么意思(气节是什么意思)教学内容四上第七单元第23课梅兰芳蓄须教学流程一导入谈话,了解梅兰芳今天,我们学习梅兰芳蓄须这课,梅兰芳是一代京剧大师,舞台生涯五十载,令万众倾心。课前同学们已预习,现在请同学读课白象在哪里(白象方便面产地)猛犸新闻东方今报记者李玮萌友杨现民鲁沛莉文图师傅,前方施工请您右转绕行,从白象方便面厂西门进入!前方还有交警给您指路!这是新郑市公安局交巡警四中队中队长敬春杰在新郑白象方便面厂附近怎么样炒饭(特色炒饭)剩米饭加四种配菜,炒出颗粒分明又美味的蛋炒饭,几乎每周都做小的时候爱吃蛋炒饭,还特别喜欢放火腿肠的蛋炒饭,感觉特别好吃。不过我小的时候,火腿肠还是挺贵的,偶尔才能吃一次,觉得特别香今日彭泽鲫鱼价格(工程鲫和土鲫鱼的区别)二者结合形成受精卵,脊背处比较高,鱼唇非常,黑龙江的方正鲫等。在繁殖季节时,云南的滇池鲫,一般来说野生的鲫鱼就是我们口中的土鲫,湖南的红鲫,等到产卵结束后。著称,已知一尾最大个体体夏门是哪里(厦门的城市定位和特色)新阶段新理念新征程推进社会主义文化强国建设光明日报记者马跃华我们的中国梦文化进万家厦门全福游有全福庆元旦广场文艺演出,日前在厦门的育秀社区广场上演,文艺工作者把文化服务带到市民和游说说丽普司肽眼霜怎么样近日有关于丽普司肽眼霜怎么样的问题受到了很多网友们的关注,大多数网友都想要知道网友们需要丽普司肽眼霜怎么样问题的具体情况,那么关于到网友们需要丽普司肽眼霜怎么样问题的相关信息,小编