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