一、引言
二、单例模式的介绍
三、为什么会有单例模式
四、剖析单例模式的实现思路
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
|
/// <summary>
/// 单例模式的实现
/// </summary>
public
class
Singleton
{
// 定义一个静态变量来保存类的实例
private
static
Singleton uniqueInstance;
// 定义私有构造函数,使外界不能创建该类实例
private
Singleton()
{
}
/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public
static
Singleton GetInstance()
{
// 如果类的实例不存在则创建,否则直接返回
if
(uniqueInstance ==
null
)
{
uniqueInstance =
new
Singleton();
}
return
uniqueInstance;
}
}
|
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
|
/// <summary>
/// 单例模式的实现
/// </summary>
public
class
Singleton
{
// 定义一个静态变量来保存类的实例
private
static
Singleton uniqueInstance;
// 定义一个标识确保线程同步
private
static
readonly
object
locker =
new
object
();
// 定义私有构造函数,使外界不能创建该类实例
private
Singleton()
{
}
/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public
static
Singleton GetInstance()
{
// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
lock
(locker)
{
// 如果类的实例不存在则创建,否则直接返回
if
(uniqueInstance ==
null
)
{
uniqueInstance =
new
Singleton();
}
}
return
uniqueInstance;
}
}
|
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
34
35
36
37
|
/// <summary>
/// 单例模式的实现
/// </summary>
public
class
Singleton
{
// 定义一个静态变量来保存类的实例
private
static
Singleton uniqueInstance;
// 定义一个标识确保线程同步
private
static
readonly
object
locker =
new
object
();
// 定义私有构造函数,使外界不能创建该类实例
private
Singleton()
{
}
/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public
static
Singleton GetInstance()
{
// 当第一个线程运行到这里时,此时会对locker对象 "加锁",
// 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
// lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
// 双重锁定只需要一句判断就可以了
if
(uniqueInstance ==
null
)
{
lock
(locker)
{
// 如果类的实例不存在则创建,否则直接返回
if
(uniqueInstance ==
null
)
{
uniqueInstance =
new
Singleton();
}
}
}
return
uniqueInstance;
}
}
|
五、C#中实现了单例模式的类
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
|
// 该类不是一个公开类
// 但是该类的实现应用了单例模式
internal
sealed
class
SR
{
private
static
SR loader;
internal
SR()
{
}
// 主要是因为该类不是公有,所以这个全部访问点也定义为私有的了
// 但是思想还是用到了单例模式的思想的
private
static
SR GetLoader()
{
if
(loader ==
null
)
{
SR sr =
new
SR();
Interlocked.CompareExchange<SR>(
ref
loader, sr,
null
);
}
return
loader;
}
// 这个公有方法中调用了GetLoader方法的
public
static
object
GetObject(
string
name)
{
SR loader = GetLoader();
if
(loader ==
null
)
{
return
null
;
}
return
loader.resources.GetObject(name, Culture);
}
}
|