001-单例模式(概述)

单例模式也被成为单件模式(或单体模式),主要作用是控制某个类型的实例数量为一个,而且只有一个。


很多时候,我们需要在应用中保存一个唯一的实例,例如后台服务进程需要一个全局的计数器,记录用户访问各个页面的点击数量。如果计数器数量非常多,那么必然会在计数过程中出现冲突的情况。为了尽量减少冲突,一个最简单的办法是只有一个计数器实例,所有计数工作都通过它来完成。


单例模式实现方式

实现单例模式的方式有很多,大体上可以分为外部方式和内部方式两种。


(1)外部方式

外部方式就是外部的客户程序使用某些全局对象时,做一些“Try-User”工作,简单说就是试着获取对象实例,如果没有,会获取不到,就自己创建一个,然后把它放在全局的位置上,然后再用,如果本来就有,则直接拿一个现成的来用。

(2)内部方式

内部方式就是类内部自己控制生成实例的数量,无论外部程序是否尝试过,类型自己先生成一个实例,然后控制只提供这一个实例,客户程序使用的都是这一个现成的实例。

但是随着集群和多核技术的普及,想通过简单的类型内部控制实现真正的单例模式越来越难,通过经典的单例模式实现分布式环境下的单例并不现实。因此本文所说的单例是有范围限制的。




单利模式特点

单例模式和工厂模式一样,是一种对象的创建模式。有如下几个特点:

1)该类只有一个实例

2)该类在自己内部自行创建自身的实例对象

3)向整个系统公开或者这个实例的接口

简单的单例模式代码实现如下:

可以看到,代码中定义了一个私有的构造器,不允许外界访问,这样外界无法通过new创建该类对象,只能在类内部new。instance就是在类内部实例化的一个对象,可以想到在全系统中也只有这一个,然后再通过getInstance这个静态方法获取:

Demo demo = Demo.getInstance();


Demo单例类在类被加载时,instance就会被初始化,即便加载器是静态的。如果初始化一个单例对象需要的开销大,那么在使用之前最合理的做法是不实例化,将实例化这个动作推迟到使用的时候,这就是惰性加载,惰性加载常常用于需要加载大量数据的单体。简单修改后的代码如下:

可以看到只是加了一个是否为null的判断,惰性加载的使用方法与普通加载完全一样。




单例模式的功能

单例模式的功能是保证这个类在运行期间只会被创建一个类实例,另外单例模式还提供了一个全局唯一访问这个类实例的访问点,就是getInstance方法。不管是上面的普通加载还是惰性加载,这个全局的唯一访问点是一样的。对于单例模式而言,不管采用何种实现方式,它都只关心类实例的创建问题,并不关心具体的业务功能。




单例模式的范围

单例类在什么范围内可以叫单例类? 目前Java里面实现的单例是一个ClassLoader及其子ClassLoader的范围。因为ClassLoader在普通加载模式下实现单例类时,会相应的创建一个类实例。


这说明如果一个虚拟机里面有很多ClassLoader,而且这些ClassLoader都装载某个类的话,就算这个类是单例,它也会产生很多个实例。如果一个机器上有多个虚拟机,那么每个虚拟机里面都至少有一个这个类的实例。也就是整个机器上就有很多个实例,这个类更不会是单例了。


另外需要注意,普通的单例模式并不适用于集群环境。




单例模式的命名

一般建议获取单例的方法命名为getInstance(),看到这个方法就知道这个方法返回类型肯定是单例类的实例了。getInstance方法可以有参数,要根据私有构造器的具体情况确定,在大多数情况下是没有参数的。单例模式的名称因为翻译的不同,也可以叫单件模式,单体模式等等。



单例模式的种类大致分为三种,分别是懒汉式单例,饿汉式单例和登记式单例。在下面的内容中会分别介绍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容