Gear.Turbo

c#设计模式Singleton

今天看了下载的webcast,李建忠讲的c#的设计模式的Singleton,感觉不错,赶紧在blog上记下来以备翻看,同时也说明引用,以免侵权: )

       一个常规的Single模式,只能创建一个实例,即使创建多个都是对同一个的引用,如下实现:

using System;

 

class Singleton

{

    private static Singleton _instance;

    private Singleton() { }

    public static Singleton Instance

    {

        get

        {

            if (_instance == null)

            {

                _instance = new Singleton();

            }

            return _instance;

        }

    }

 

}

class test

{

    public static void Main()

    {

        Singleton a = Singleton.Instance;

        Singleton b = Singleton.Instance;

        Console.WriteLine(Object.ReferenceEquals(a, b).ToString());

    }

}

 

   上面的代码是单线程的,因为在多线程中容易产生多个实例,问题就在如下三行代码之间产生:

if (_instance == null)

            {

                _instance = new Singleton();

       因此,对于多线程的Singleton模式如下:

using System;

 

class Singleton

{

       private static volatile Singleton _instance = null;

       private static object lockHelper = new object();

       private Singleton(){}

       public static Singleton Instance

       {

              get

              {

                     if (_instance == null)

                     {

                            lock(lockHelper)

                            {

                                   if(_instance == null)

                                   {

                                          _instance = new Singleton();

                                   }

                            }

                     }

                     return _instance;

              }

       }

 

}

class test

{

       public static void Main()

       {

              Singleton a = Singleton.Instance;

              Singleton b = Singleton.Instance;

              Console.WriteLine(Object.ReferenceEquals(a,b).ToString());

       }

}

 

对此感觉设计挺好,后来听说有人用更简单的方法实现:

sing System;

 

class Singleton

{

       public static readonly Singleton Instance = new Singleton();

       private Singleton(){}

}

 

class Test

{

       public static void Main()

       {

              Singleton a = Singleton.Instance;

              Singleton b = Singleton.Instance;

              Console.WriteLine(object.ReferenceEquals(a,b).ToString());

       }

}

       恩。。。确实不错!不过,还是有点疑惑的是:总觉得那个readonly加不加无所谓!

       还有一点值得明确指出加以备忘的是:程序中public static readonly Singleton Instance = new Singleton();所调用的构造函数Singleton()并不是下面所声明的private Singleton(){}, 因为编译器是这样处理的,对于静态的属性是用静态构造函数来实现的,这个静态构造函数是编译器自动生成的,关于这个用ildasm反汇编即可看出。对于private Singleton(){}在程序中并没有调用,它的作用是用来屏蔽系统自动生成构造函数功能,以防止用户new新实例。

posted on 2006-12-22 23:28  lsp  阅读(241)  评论(0)    收藏  举报

导航