一、 单例(Singleton)模式
单例模式的特点:
- 单例类只能有一个实例。
- 单例类必须自己创建自己的唯一实例。
- 单例类必须给所有其它对象提供这一实例。
三种实现方式
1 双重锁定
1
public sealed class Singleton
2
{
3
static Singleton instance=null;
4
static readonly object padlock = new object();
5
6
Singleton()
7
{
8
}
9
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

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

这种实现方式对多线程来说是安全的,同时线程不是每次都加锁,只有判断对象实例没有被创建时它才加锁,有了我们上面第一部分的里面的分析,我们知道,加锁后还得再进行对象是否已被创建的判断。它解决了线程并发问题,同时避免在每个 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
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
21
internal static readonly Singleton instance = new Singleton();
22
}
23
}
24

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

这里,初始化工作有Nested类的一个静态成员来完成,这样就实现了延迟初始化,并具有很多的优势,是值得推荐的一种实现方式。