经常要用到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

UnitTest:
Test

http://wintersun.cnblogs.com
posted on 2008-12-28 16:19  PetterLiu  阅读(956)  评论(3编辑  收藏  举报