数据结构+算法=程序
程序+设计模式=软件

0%

单例模式(Singleton)

官方定义

确保一个类只有一个实例,并提供一个全局访问点。

分类

创建型模式

思想

一个类的对象永远只会在当前进程中被创建一次,也就是说构造函数只可能被调用一次,不论有多少线程调用。为什么需要单例,假如这个类是用来操作某个资源的,如果存在多个这个类的实例,这可能在操作这个资源的时候造成破坏,所以只能创建一个实例是很有必要的。

UML类图

实现

一般来说,直接把对象声明为静态即可,程序集在加载过程中进行构造,这个也是线程安全的。但问题是如果此对象一直没有被调用,同时构造函数的开销较大,这个会造成资源浪费。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Singleton
{
private static Singleton instance = new Singleton();

/// <summary>
/// 构造函数声明为私有
/// </summary>
private Singleton()
{
Console.WriteLine("执行构造函数");
}

public static Singleton Get()
{
return instance;
}
}

著名的双检锁法,只在需要时执行构造函数,同时也是线程安全的

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
32
33
class Singleton
{
private static Singleton instance = null;
private static readonly object lockobj = new object();

/// <summary>
/// 构造函数声明为私有
/// </summary>
private Singleton()
{
Console.WriteLine("执行构造函数");
}

/// <summary>
/// 双检锁
/// </summary>
/// <param name="owner"></param>
/// <returns></returns>
public static Singleton Get()
{
if (instance == null)
{
lock (lockobj)
{
if (instance == null)
{
instance = new Singleton();
}
}
}
return instance;
}
}