SingleTon类
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
namespace Gof.Nan.Test
6![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
7
public class SingleTon
8![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
9
private static SingleTon _singleTon;
10
private SingleTon()
11![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{ }
12
public static SingleTon CreateInstance()
13![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
14
if (_singleTon == null)
15![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
16
_singleTon = new SingleTon();
17
}
18
return _singleTon;
19
}
20
}
21
}
测试代码
1
Gof.Nan.Test.SingleTon s1, s2;
2
s1 = Gof.Nan.Test.SingleTon.CreateInstance();
3
s2 = Gof.Nan.Test.SingleTon.CreateInstance();
4
if (s1.Equals(s2))
5![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
6
Response.Write("s1 is s2");
7
}
一个特定的对象承担了其个职责,而其它的对象必需依赖这个职责.当然这里我们用了(Lazy Initialization)来保证在第一次使用时再创建实例.
为什么要对SingleTon进行惰性初始化:
1.我们可能没有足够的信息,所以无法在某个特定的时刻实例化一个SingleTon.例如,为了创建一个Factory SingleTon,我们可能必须等待,直到实际工厂中的机器之间都建起了通信渠道.
2.如果某个SingleTon对象需要一些资源,例如,一个数据库连接,那么,我们可以使用惰性初始化.另外,如果在一个会话过程中,这个应用程序不需要使用这个SingleTon,那么我们也需要使用惰性初始化.
在多线程环境中进行惰性初始化时,必须防止多线程对SingleTon进行多次初始化.
支持多线程的SingleTon
1
using System;
2
using System.Collections.Generic;
3
using System.Text;
4![None.gif](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
5
namespace Gof.Nan.Test
6![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
7
class SingleTonInMultiThread
8![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
9
private static SingleTonInMultiThread _singleTon;
10
private static object _classLock = typeof(SingleTon);
11
private long _wipMoves;//私有变量,表示一定的意义.
12![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private SingleTonInMultiThread()
{
13
_wipMoves = 0;
14
}
15
public SingleTonInMultiThread CreateInstance()
16![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
17
lock (_classLock)
18![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
19
if (_singleTon == null)
20![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
21
_singleTon = new SingleTonInMultiThread();
22
}
23
return _singleTon;
24
}
25
}
26
public void DoSomething()
27![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
28
lock (_classLock)//保证其在执行时的线程安全性
29![ExpandedSubBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
30
_wipMoves++;
31
}
32
}
33
}
34
}
The Singleton Pattern ensures a class has oly one instance, and provides a global point of access to it.