经常要用到Singleton模式,通常情况下我们是为那个类写一个static method来创建对象。.net3.5下,可以封装这么一个辅助类,
看代码如下:
1 #region Singleton
2 /// <summary>
3 /// Used for classes that are single instances per appdomain
4 /// </summary>
5 public static class Singleton
6 {
7 private static class Storage<T>
8 {
9 internal static T s_instance;
10 }
11
12 /// <summary>
13 /// Gets the instance.
14 /// </summary>
15 /// <typeparam name="T">Func<T></typeparam>
16 /// <param name="op">The op.</param>
17 /// <returns>T</returns>
18 /// <remark>Author : PetterLiu 2008-12-2816:02 http://wintersun.cnblogs.com </remark>
19 public static T GetInstance<T>(Func<T> op)
20 {
21 if (Storage<T>.s_instance == null)
22 {
23 lock (typeof(Storage<T>))
24 {
25 if (Storage<T>.s_instance == null)
26 {
27 T temp = op();
28 System.Threading.Thread.MemoryBarrier();
29 Storage<T>.s_instance = temp;
30 }
31 }
32 }
33 return Storage<T>.s_instance;
34 }
35
36 /// <summary>
37 /// Gets the instance.
38 /// </summary>
39 /// <typeparam name="T">T</typeparam>
40 /// <returns>T</returns>
41 /// <remark>Author : PetterLiu 2008-12-2816:02 http://wintersun.cnblogs.com </remark>
42 public static T GetInstance<T>()
43 where T : new()
44 {
45 return GetInstance(() => new T());
46 }
47 }
48 #endregion
2 /// <summary>
3 /// Used for classes that are single instances per appdomain
4 /// </summary>
5 public static class Singleton
6 {
7 private static class Storage<T>
8 {
9 internal static T s_instance;
10 }
11
12 /// <summary>
13 /// Gets the instance.
14 /// </summary>
15 /// <typeparam name="T">Func<T></typeparam>
16 /// <param name="op">The op.</param>
17 /// <returns>T</returns>
18 /// <remark>Author : PetterLiu 2008-12-2816:02 http://wintersun.cnblogs.com </remark>
19 public static T GetInstance<T>(Func<T> op)
20 {
21 if (Storage<T>.s_instance == null)
22 {
23 lock (typeof(Storage<T>))
24 {
25 if (Storage<T>.s_instance == null)
26 {
27 T temp = op();
28 System.Threading.Thread.MemoryBarrier();
29 Storage<T>.s_instance = temp;
30 }
31 }
32 }
33 return Storage<T>.s_instance;
34 }
35
36 /// <summary>
37 /// Gets the instance.
38 /// </summary>
39 /// <typeparam name="T">T</typeparam>
40 /// <returns>T</returns>
41 /// <remark>Author : PetterLiu 2008-12-2816:02 http://wintersun.cnblogs.com </remark>
42 public static T GetInstance<T>()
43 where T : new()
44 {
45 return GetInstance(() => new T());
46 }
47 }
48 #endregion
UnitTest:
Test
http://wintersun.cnblogs.com