c#面向对象设计模式纵横谈--Singleton单件(创建型模式)

  Singleton单件是一种比较简单的创建型模式。模式从目的来看可以分为三类:第一类是创建型应用模式,主要负责对象的创建;第二类是结构型应用模式,用来处理类与对象之间的组合;第三类是行为型应用模式,用来处理类与对象之间的职责分配。从范围来看,类模式用来处理类与子类的静态关系,而对象模型用来处理对象间的动态关系。

      Singleton模式的动机是在软件系统中, 经常有这样的一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性以及良好的效率。设计模式的意图是保证一个类仅有一个实例,并且提供一个该实例的全局访问点。

下面是单线程下的一个Singleton的代码实例:

public 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 t1 = Singleton.Instance;

Singleton t2 = Singleton.Instance;

Console.Writeline(Object.ReferenceEquals(t1,t2)==true); //这一句是用来测试两个实例的引用是否相等。
}}

而多线程下singleton模式的实现如下所示:

 

Class Singleton
{
  private static volatile Singleton instance=null;//volatile在编译是不进行微调
  private static object lockHelper=new Object();

 private Singleton()//私有构造器,使得Singleton 只可以在本类的内部被创建
    {

   }
 
  public static Singleton Instance

      {

              get

           {

                    if(instance==null)
       {

                           lock(lockHelper)//这里采用double check方式
                            {
                                 if(instance==null)//避免了两个线程产生两个实例的危险

                                 {

                                 }
                          }
                    }

                    return instance;

              }

}

 

多线程Singleton Pattern的一种更好的方式:


 class Singleton
 
 {
 
        public static readonly Singleton Instance=new Singleton();
 
        private Singleton()
 
     {

      }

};


class Singleton
 
 {

     public static readonly Singleton Instance;


       static Singleton()//静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数(由系统调用),不支持参数传递

      {              Instance =new Singleton();

      }
 
      private Singleton()
       {

       }

};


 

 

posted @ 2010-08-02 23:04  美梦成真  阅读(171)  评论(0编辑  收藏  举报