设计模式 之 单例模式

设计模式 之 单例模式

在某些特定的情况下,例如 线程池,内存池的管理类,要求只能创建一个实例的时候就可以用到单例模式。我们可以通过将构造函数私有化的方法来实现单例模式。本文着重于多线程下的单例模式。

1.单例模式实现

通过将构造函数私有化,提供静态函数并返回静态成员对象的方法来实现单例模式。注意将拷贝构造也私有化,不然就可以通过拷贝构造创建实例了。

#include
#include
using namespace std;
mutex m;
class Singleton
{
private :
 Singleton() {};  //私有默认构造
 Singleton(const Singleton&) {};   //私有化拷贝构造
 static Singleton* m_instance;  //静态成员对象
 public:
 static Singleton& GetInstance()  //返实例的静态函数
 {
  if (Singleton::m_instance == nullptr)
  {
   m.lock();
   if (Singleton::m_instance == nullptr)  //双重检测,确保线程安全
   {
    Singleton::m_instance = new Singleton;
  }
   m.unlock();
   return *Singleton::m_instance;
  }
  return *Singleton::m_instance;
 }
 
};
Singleton* Singleton::m_instance = nullptr;
int main()
{
 Singleton::GetInstance();
}

2.线程安全

利用双重检测来保证线程安全,也可以利用lock_guard 或 unique_lock() 来代替mutex互斥量。

#include
#include
using namespace std;
mutex m;
class Singleton
{
private :
 Singleton() {};
 Singleton(const Singleton&) {};
 static Singleton* m_instance;
 public:
static Singleton& GetInstance()
 {
  if (Singleton::m_instance == nullptr)
  {
   lock_guard<mutex>m_guard(m);
   if (Singleton::m_instance == nullptr)
   {
    Singleton::m_instance = new Singleton;
   }
   return *Singleton::m_instance;
  }
  return *Singleton::m_instance;
 }
 
};
Singleton* Singleton::m_instance = nullptr;
int main()
{
 Singleton::GetInstance();
}

3.析构问题

可以利用在单例类中定义回收类来释放实例。实现原理就是在回收类的析构中delete实例,在创建实例时同时创建一个回收类的静态栈对象,这样程序结束时栈中的回收类对象会调用析构函数,也就释放了实例对象。

#include
#include
using namespace std;
mutex m;
class Singleton
{
private :
 Singleton() {};
 Singleton(const Singleton&) {};
 static Singleton* m_instance;
 class Recover
 {
 public:
  ~Recover()
  {
   if (Singleton::m_instance != nullptr)
   {
    delete Singleton::m_instance;
    Singleton::m_instance = nullptr;
   }
  }
 };
public:
 static Singleton& GetInstance()
 {
  if (Singleton::m_instance == nullptr)
  {
   lock_guard<mutex>m_guard(m);
   if (Singleton::m_instance == nullptr)
   {
    Singleton::m_instance = new Singleton;
    static Recover recover;
   }
   return *Singleton::m_instance;
  }
  return *Singleton::m_instance;
 }
 
};
Singleton* Singleton::m_instance = nullptr;
int main()
{
 Singleton::GetInstance();
}

你可能感兴趣的:(设计模式 之 单例模式)