几种语言的单例模式的实现(C++/C#/Object-C)

来源:互联网 发布:滴定分析数据意思 编辑:程序博客网 时间:2024/05/18 02:14

一、 C++

考虑到线程安全、异常安全

    class Lock      {      private:                 CCriticalSection m_cs;      public:          Lock(CCriticalSection  cs) : m_cs(cs)          {              m_cs.Lock();          }          ~Lock()          {              m_cs.Unlock();          }      };            class Singleton      {      private:          Singleton();          Singleton(const Singleton &);          Singleton& operator = (const Singleton &);            public:          static Singleton *Instantialize();          static Singleton *pInstance;          static CCriticalSection cs;      };            Singleton* Singleton::pInstance = 0;            Singleton* Singleton::Instantialize()      {          if(pInstance == NULL)          {   //double check              Lock lock(cs);           //用lock实现线程安全,用资源管理类,实现异常安全              //使用资源管理类,在抛出异常的时候,资源管理类对象会被析构,析构总是发生的无论是因为异常抛出还是语句块结束。              if(pInstance == NULL)              {                  pInstance = new Singleton();              }          }          return pInstance;      }  


二、 OC

+ (singletonObj *)sharedInstance{    static dispatch_once_t onceToken = 0;    static singletonObj *sharedObject = nil;    dispatch_once(&onceToken, ^{        sharedObject = [[singletonObjr alloc] init];    });        return sharedObject;}


三、 C#

public class Singleton{  //定义一个静态变量来保存类的实例  private static Singleton example;  //定义一个标识确保线程同步  private static readonly object locker = new object();  //定义私有构造函数,使外界不能创建该类的实例  private Singleton()  {    Console.Write("这是单例模式测试\n");  }  /// <summary>  /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点  /// </summary>  /// <returns></returns>  public static Singleton GetInstance()  {    //多线程同时运行到这里,会同时通过这个判断条件执行条件内的代码    if (example== null)//限制一    {      //多线程同时运行到这里后,只能有一个线程通过lock锁,其他线程会被挂起      lock (locker)//限制二      {        // 再次判断如果类的实例是否创建,如果不存在则实例化,反之就直接输出类的实例        if (example== null)限制三        {          example= new Singleton();        }      }    }    return example;  }}



注意创建对象的同步、对象释放以及执行效率等问题。

0 0