没有合适的资源?快使用搜索试试~ 我知道了~
单例模式(Singleton)的6种实现
4星 · 超过85%的资源 需积分: 50 3 下载量 107 浏览量
2017-11-02
11:14:02
上传
评论
收藏 1.17MB PDF 举报
温馨提示
试读
15页
单例模式(Singleton)的6种实现,单例模式(Singleton)的6种实现
资源推荐
资源详情
资源评论
2014年5月8日 单例模式(Singleton)的6种实现 - JK_Rush - 博客园
http://www.cnblogs.com/rush/archive/2011/10/30/2229565.html 1/15
单例模式(Singleton)的6种实现
1.1.1 摘要
在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数
据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创
建或始终使用一个公用的实例,这就是我们今天要介绍的——单例模式
(Singleton)。
使用频率 高
单件模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访
问点。
1.1.2 正文
图1单例模式(Singleton)结构图
单例模式(Singleton)是几个创建模式中最对立的一个,它的主要特点不是根据
用户程序调用生成一个新的实例,而是控制某个类型的实例唯一性,通过上图我们知道
它包含的角色只有一个,就是Singleton,它拥有一个私有构造函数,这确保用户无法
通过new直接实例它。除此之外,该模式中包含一个静态私有成员变量instance与静态
公有方法Instance()。Instance()方法负责检验并实例化自己,然后存储在静态成员变
量中,以确保只有一个实例被创建。
图2单例模式(Singleton)逻辑模型
接下来我们将介绍6中不同的单例模式(Singleton)的实现方式。这些实现方式
都有以下的共同点:
1. 有一个私有的无参构造函数,这可以防止其他类实例化它,而且单例类
37 0
(请您对文章做出评价)
公告
Github Email
昵称:JK_Rush
园龄:3年6个月
荣誉:推荐博客
粉丝:879
关注:5
+加关注
< 2011年10月 >
日 一 二 三 四 五 六
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
搜索
找找看
谷歌搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
About Me
黄钧航(JKhuang),职业攻城师。
有幸从事挨踢职业,从此踏上了学
海无涯这条不归路。 曾热衷于
ACM,故钟情于数据结构与算法,
工作后由于面临系统性能瓶颈问
题,故学习前端和后端高性能, 对
开源分布式系统和高性能实施方案
感兴趣,但个人水平一般固依然无
所获。 相信天道酬勤,固孜孜不
倦,而且希望能够通过和大家交流
分享中获得提高。
座右铭:时间就像一阵风,风会吹
去浮沙,留下的是真正重要的东
西。
自我修养:能力矩阵
JK_Rush
博客园 首页 博问 闪存 新随笔 联系 订阅 管理
随笔-60 文章-0 评论-651
2014年5月8日 单例模式(Singleton)的6种实现 - JK_Rush - 博客园
http://www.cnblogs.com/rush/archive/2011/10/30/2229565.html 2/15
也不应该被继承,如果单例类允许继承那么每个子类都可以创建实例,
这就违背了Singleton模式“唯一实例”的初衷。
2. 单例类被定义为sealed,就像前面提到的该类不应该被继承,所以为了保
险起见可以把该类定义成不允许派生,但没有要求一定要这样定义。
3. 一个静态的变量用来保存单实例的引用。
4. 一个公有的静态方法用来获取单实例的引用,如果实例为null即创建一
个。
版本一线程不安全
/// <summary>
/// A simple singleton class implements.
/// </summary>
public sealed class Singleton
{
private static Singleton _instance = null;
/// <summary>
/// Prevents a default instance of the
/// <see cref="Singleton"/> class from being created.
/// </summary>
private Singleton()
{
}
/// <summary>
/// Gets the instance.
/// </summary>
public static Singleton Instance
{
get { return _instance ?? (_instance = new Singleton()); }
}
}
以上的实现方式适用于单线程环境,因为在多线程的环境下有可能得到Singleton
类的多个实例。假如同时有两个线程去判断
(null == _singleton),并且得到的结果为真,那么两个线程都会创建类Singleton
的实例,这样就违背了Singleton模式“唯一实例”的初衷。
版本二线程安全
/// <summary>
/// A thread-safe singleton class.
/// </summary>
public sealed class Singleton
{
private static Singleton _instance = null;
private static readonly object SynObject = new object();
Singleton()
{
}
最新随笔
1. SignalR + KnockoutJS + ASP.NET
MVC4 实现井字游戏
2. Knockout JS实现任务管理应用程序
3. 博文占位年后发布
4. Ember.js实现单页面应用程序
5. jQuery实现在线文档
6. jQuery自动加载更多程序
7. Weibo用户地图
8. jQuery实现放大镜效果
9. ASP.NET MVC实现仪表程序
10. [译]C++, Java和C#的编译过程解
析
我的标签
Javascript(9)
jQuery(7)
Asp.net(4)
ASP.NET MVC(3)
C#(2)
.NET(2)
Ajax(2)
Ember(2)
SQL(2)
weibo(2)
更多
随笔分类
[00] .NET Entlib(3)
[01] .NET(21)
[02] C#(25)
[03] ADO.NET(1)
[04] ASP.NET(9)
[05] Design Pattern(11)
[06] VB.NET(1)
[07] C/C++(1)
[08] Web(15)
[09] Linq
[10] Algorithm(1)
[11] Security(4)
[12] Javascript/jQuery(12)
[13] High Performance
[14] SQL(5)
Miscellaneous(1)
Trouble Shooting
水区(1)
随笔档案
2014年4月 (1)
2014年2月 (1)
2014年1月 (1)
2013年12月 (1)
2013年11月 (1)
2013年10月 (1)
2013年9月 (1)
2013年8月 (1)
2014年5月8日 单例模式(Singleton)的6种实现 - JK_Rush - 博客园
http://www.cnblogs.com/rush/archive/2011/10/30/2229565.html 3/15
/// <summary>
/// Gets the instance.
/// </summary>
public static Singleton Instance
{
get
{
// Syn operation.
lock (SynObject)
{
return _instance ?? (_instance = new Singleton());
}
}
}
}
以上方式的实现方式是线程安全的,首先我们创建了一个静态只读的进程辅助对
象,由于lock是确保当一个线程位于代码的临界区时,另一个线程不能进入临界区(同
步操作)。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放。
从而确保在多线程下不会创建多个对象实例了。只是这种实现方式要进行同步操作,这
将是影响系统性能的瓶颈和增加了额外的开销。
Double-Checked Locking
前面讲到的线程安全的实现方式的问题是要进行同步操作,那么我们是否可以降低
通过操作的次数呢?其实我们只需在同步操作之前,添加判断该实例是否为null就可以
降低通过操作的次数了,这样是经典的Double-Checked Locking方法。
/// <summary>
/// Double-Checked Locking implements a thread-safe singleton class
/// </summary>
public sealed class Singleton
{
private static Singleton _instance = null;
// Creates an syn object.
private static readonly object SynObject = new object();
Singleton()
{
}
public static Singleton Instance
{
get
{
// Double-Checked Locking
if (null == _instance)
{
lock (SynObject)
{
if (null == _instance)
{
_instance = new Singleton();
}
}
}
2013年7月 (1)
2013年6月 (1)
2013年5月 (1)
2013年4月 (1)
2013年3月 (1)
2013年2月 (1)
2013年1月 (1)
2012年12月 (1)
2012年11月 (1)
2012年10月 (1)
2012年9月 (1)
2012年8月 (1)
2012年7月 (1)
2012年6月 (1)
2012年5月 (1)
2012年4月 (1)
2012年3月 (2)
2012年2月 (3)
2012年1月 (1)
2011年12月 (3)
2011年11月 (1)
2011年10月 (2)
2011年9月 (2)
2011年8月 (1)
2011年7月 (2)
2011年6月 (4)
2011年5月 (6)
2011年4月 (4)
2011年3月 (1)
2011年2月 (2)
2011年1月 (1)
2010年11月 (1)
积分与排名
积分 - 125458
排名 - 1009
最新评论
1. Re:SignalR + KnockoutJS +
ASP.NET MVC4 实现井字游戏
@风情波涌@帝之晓Demo上传了。...
--JK_Rush
2. Re:SignalR + KnockoutJS +
ASP.NET MVC4 实现井字游戏
bootstrap 感觉不太好学
--芒果の冰
3. Re:SignalR + KnockoutJS +
ASP.NET MVC4 实现井字游戏
好久没见你发文了 感谢分享!
--倚天照海- -
4. Re:SignalR + KnockoutJS +
ASP.NET MVC4 实现井字游戏
GOOD
--euler
5. Re:SignalR + KnockoutJS +
ASP.NET MVC4 实现井字游戏
剩余14页未读,继续阅读
资源评论
- xiaoyuVS2018-01-04文件损坏啦???
慕名而来
- 粉丝: 8
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功