锋利的C#

  程序员博客 :: 首页 :: 新随笔 :: 订阅 :: 管理 :: 登录 ::
访问csharp的空间

随笔分类

随笔归档

个人相册

阅读排行榜

评论排行榜

最新评论

csharp 阅读(5457) 评论(1)

作者:Cloud Hsu
来自:外链网址已屏蔽cloudhsu921en.blogspot.com/

为什么要使用泛型单例模式?如果我们使用一个名为ISingleton的接口,并提供实例属性,我们必须在所有派生类中实现。
或者我们需要在所有单例类(singleton class)中提供实例属性。这是个麻烦,因此我们使用泛型解决它。
因为单例需要提供private或protected的构造函数,因此我们需要在泛型单例模式中使用new T(),我们需要使用反射来调用构造函数。

代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace DesignPattern
{
  public class TSingleton<T> where T : class
  {
      static object SyncRoot = new object();
      static T instance;
      public static readonly Type[] EmptyTypes = new Type[0];
      public static T Instance
      {
          get
          {
              if (instance == null)
              {
                  lock (SyncRoot)
                  {
                      if (instance == null)
                      {
                          ConstructorInfo ci = typeof(T).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, EmptyTypes, null);
                          if (ci == null) { throw new InvalidOperationException("class must contain a private constructor"); }
                          instance = (T)ci.Invoke(null);
                          //instance = Activator.CreateInstance(typeof(T)) as T;
                      }
                  }
              }
              return instance;
          }
      }
  }
}

评论列表
rainrcn
public sealed class Singleton<T> where T : new()
    {
        public static T Instance
        {
            get { return SingletonCreator.instance; }
        }
        class SingletonCreator
        {
            internal static readonly T instance = new T();
        }
    }
//即可

发表评论
切换编辑模式