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

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

  我们在编程中最常用的模式就是单例模式了,然而单例模式都用在什么场合?为什么不用静态方法而要用单例模式呢?要搞清这些问题,需要从静态方法和非静态方法的区别和联系说起。
  一、静态方法常驻内存,非静态方法只有使用的时候才分配内存?
  一般都认为是这样,并且怕静态方法占用过多内存而建议使用非静态方法,其实这个理解是错误的。
  为什么会这样,先从内存分配开始说起:
  托管堆的定义:对于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款自制饮品,清凉可口好解暑)饮品做法(3款自制饮品,清凉可口好解暑)最近周围小伙伴点冷饮的频次越来越多了,一口清凉解暑的夏日清凉真是爽歪歪,何不自己做几款随心畅饮呢。杨枝甘露作为一款年代久远深受大众喜欢的经典健康养生茶(10款实用养生茶)健康养生茶(10款实用养生茶)药师介绍的几款实用养生茶,让你亚健康的身体恢复到健康水平!1枸杞菊花茶补肝肾明目2山药灵芝茶助降糖3三七山楂茶助降压降脂4决明子荷叶茶通大便5莲子芡实最健康的早餐(100种懒人营养的早餐)最健康的早餐(100种懒人营养的早餐)一周健康早餐食谱来了,大人孩子都爱吃,关键是简单好做。上班族的5天早餐,每天都好吃不重复,不用早起10分钟搞定。前面有网友问我一周早餐怎么是5人与人之间的交往!(人与人之间交往最重要的是什么?)人与人之间的交往(人与人之间交往最重要的是什么?)小窗幽记中说使人有乍交之欢,不若使人无久处之厌。这句话的意思是,让对方产生与自己初次相交的欣喜,不如相交久了而不会让对方感到厌恶。买车主要看什么(汽车最重要的五项配置)我们平时买车时都会对比很多参数配置,但是那些参数配置表是别人做好给我们看的,他们不想让我们看的东西根本不会往上面写。可是这些配置从某种程度上来说却反映了厂家是否用心,只是很多人都容钟南山人的命是最重要的人权近日人的命是最重要的人权登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下人的命是最重钟南山中国人的命最重要近日钟南山登录了热搜,也是在网上引起了网友们的关注,那么很多小伙伴可能还不清楚具体的情况如何,小编也是在网上查阅了一些信息,那么接下来就分享给大家来了解下钟南山具体的情况吧钟南山中夫妻之间如何相处(夫妻最好的相处模式)夫妻之间如何相处(夫妻最好的相处模式)唐若心学原创作品,违者必究在价值共生这本书中,陈春花表示如果企业想发挥强个体的作用,就要明白管控显然是不被强个体接受的。如果组织不能赋能强个体夫妻相处之道人生感悟(婚姻生活的感悟句子)夫妻相处之道人生感悟(婚姻生活的感悟句子)1。爱情和婚姻的基础是忠诚信任和妥协。如果一个人非常疼爱你,但却出轨,那不是爱情一个人非常重视你,却一直不相信你,也不是好的婚姻而两个人看夫妻相处之道(浅谈夫妻相处之道)夫妻相处之道(浅谈夫妻相处之道)这个话题千古年来都是地道的一个难题,所谓仁者见仁,智者见智。夫妻相处之道说起来很容易,每个人都懂几分,但很多人同时又在实际生活中很迷茫。我也是已婚人
哈伦裤搭配(哈伦裤搭配什么衣服)哈伦裤搭配(哈伦裤搭配什么衣服)黑色的哈伦裤与芥末绿的宽松针织上衣搭配起来充满了复古的味道,裤脚稍微卷起来一点穿着更加时尚,搭配短靴和墨镜凹造型帅帅的。02宽松套头卫衣宽松的套头卫哈伦裤适合什么人穿(哈伦裤是不是偏大)随着时尚元素的多元化,我们有了更多的服装可以选择。即便是女性的服装,也得到了更大的改进。除了优雅甜美的裙装以外,各种飒酷时髦的裤装也受到了女性的欢迎。多元化的风格,迎来了一个更加绚什么是冲锋衣(为什么冲锋衣没人穿了)冲锋衣,顾名思义就是冲顶时所穿着的衣服,在国外较多称呼为风衣茄克或防风茄克。因其防风防雨保暖等特点,成为了很多户外爱好者外出的必备装备。是户外运动爱好者的必备装备之一。从现代登山的定制牛仔裤(私人定制牛仔裤)定制牛仔裤(私人定制牛仔裤)在多伦多有一家名叫彩虹之上(OverTheRainbow)家族企业,自1975年以来一直是当地居民和海外游客购买牛仔裤的必逛的目的地。因为一直为大家提供橘色配什么颜色好看(暗橘色搭配什么颜色最佳)橘色是一种充满活力的颜色,让人看起来精神满满,但是有的小伙伴不知道橘色配什么颜色会比较好看,所以带着这个问题,下面小编就跟大家分享一些好看的橘色穿搭,感兴趣的小伙伴就一起了解一下吧男生怎么搭配衣服(哪款胸罩男士可以穿)之前几天没有更男生穿搭,有粉丝在后台我,今天就给大家推荐几款上班约会逛街必备款吧!LOOK1毛领皮衣白色休闲西装裤切尔西靴简单大方的男生穿搭喜欢这样穿的男生简约商务帅气切尔西靴穿搭男人穿什么衣服有气质(男4岁穿什么衣服有气质)上次写了儿童服饰的色彩搭配,大家留言说都是女孩子,那么,今天写写男童吧,虽然性别不同,对色相运用有所偏好,但在色彩搭配技巧上是相通的。不要总觉得男孩子要素养,色彩只敢给女生用,仿佛哪里有油茶(油茶好喝在哪)新华社南宁9月19日电(记者黄庆刚杨驰)一杯苦二杯涩三杯四杯好油茶。恭城油茶喷喷香,一天回来喝三碗,又有茶叶又有姜身穿传统瑶族服饰的卢中兰手拿木槌在铁锅里捶打茶叶,一边哼唱当地的油油菜籽出油率(高产油菜品种排名)油菜籽出油率(高产油菜品种排名)油菜籽曾经是中国最主要的油料作物,当时的植物油包括棉籽油花生油大豆油和木本植物(油茶核桃药籽木籽油和漆籽油),随着农业内部结构的不断优化和改善,已经东北的风俗(东北历史上特有的风俗文化现象)东北的风俗(东北历史上特有的风俗文化现象)东东北作为汉人与各少数民族共同居住的地方,有一些民俗和文化是比较独特的,大体可分为渔猎文化农耕文化饮食文化征战文化等等,表现形式如大家熟知北京别墅图片(豪华别墅庭院大门)北京别墅图片(豪华别墅庭院大门)现代人看多了这个世界的喧嚣和花花绿绿,想要的生活其实很简单,有一块地,建一栋房子,能承载一家人的喜悦,能让你卸下浮华,回归淳朴的田园生活。下面这款是