C#设计模式-Singleton Pattern
一、 单例(Singleton)模式
单例模式的特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其它对象提供这一实例。
三种实现方式
1 双重锁定
1
public sealed class Singleton
2
{
3
static Singleton instance=null;
4
static readonly object padlock = new object();
5![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
Singleton()
7
{
8
}
9![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
public static Singleton Instance
11
{
12
get
13
{
14
if (instance==null)
15
{
16
lock (padlock)
17
{
18
if (instance==null)
19
{
20
instance = new Singleton();
21
}
22
}
23
}
24
return instance;
25
}
26
}
27
}
28![](https://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
9
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
11
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
12
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
14
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
20
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
22
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
23
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
24
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
26
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
28
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif)
这种实现方式对多线程来说是安全的,同时线程不是每次都加锁,只有判断对象实例没有被创建时它才加锁,有了我们上面第一部分的里面的分析,我们知道,加锁后还得再进行对象是否已被创建的判断。它解决了线程并发问题,同时避免在每个 Instance 属性方法的调用中都出现独占锁定。它还允许您将实例化延迟到第一次访问对象时发生。实际上,应用程序很少需要这种类型的实现。大多数情况下我们会用静态初始化。这种方式仍然有很多缺点:无法实现延迟初始化。
2 静态初始化
sealed class Singleton{
private Singleton();
public static readonly Singleton Instance=new Singleton();
}
3 延迟初始化
延迟初始化
1
public sealed class Singleton
2
{
3
Singleton()
4
{
5
}
6![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
public static Singleton Instance
8
{
9
get
10
{
11
return Nested.instance;
12
}
13
}
14
15
class Nested
16
{
17
static Nested()
18
{
19
}
20![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
internal static readonly Singleton instance = new Singleton();
22
}
23
}
24![](https://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
6
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
8
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
9
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
11
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
13
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
14
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
17
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
18
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
19
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
21
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
23
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
24
![](https://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif)
这里,初始化工作有Nested类的一个静态成员来完成,这样就实现了延迟初始化,并具有很多的优势,是值得推荐的一种实现方式。
作者:chhuic
出处:http://chhuic.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。