单例模式

定义:

  保证一个类仅有一个实例,并提供一个访问它的全局访问点。

单体模式分为懒汉模式和饿汉模式:
饿汉模式:在编译加载时就用静态初始化的方式实例化自己,优点是不需要编写线程安全代码,在多线程环境下它是安全的;缺点是提前占用系统资源。
懒汉模式:在第一次被引用时才实例化自己,优点是不必提前占用系统资源,缺点是需要保证多线程访问的安全问题。

结构图: 

 

代码

 //懒汉模式

class CSingleton
{
public:
  static CSingleton* GetInstance()
  {
    if ( m_pInstance == NULL )

    {

      //先判断后加锁,防止每次调用单例都需要操作锁。

      lock();

      //这里双重锁定为了线程安全。
      if (instance == NULL)
      {
        m_pInstance = new CSingleton();
      }
      unlock();

      return m_pInstance;

    }
  }
private:
  CSingleton(){}; 

  //拷贝构造和【=】也私有化,防止通过这两个多实例。

  CSingleton(const CSingleton &); 

  CSingleton& operator = (const CSingleton &);

  static CSingleton * m_pInstance;

 }

//饿汉模式

class CSingleton 

public: 
  static CSingleton* GetInstance() 
  { 

    return m_pInstance;

  } 
private: 
  CSingleton(){}; 

  //拷贝构造和【=】也私有化,防止通过这两个多实例。

  CSingleton(const CSingleton &); 

  CSingleton& operator = (const CSingleton &);

  static CSingleton * m_pInstance =  new CSingleton();

 }

 

使用时机:

  当你需要唯一实例时,比如lib类(用于保存数据)、管理类等

 

优点:

1、在内存里只有一个实例,减少了内存的开销;

2、因为是唯一实例,可以用于保存数据、实现管理等。

 

缺点:

1、没有接口,不能继承,与单一职责原则冲突;

2、单例是极端的类,一个类应该只关注自己内部的方法实现,而不是关注外面怎么实例化。

posted @ 2020-08-16 15:17  吉尔加斯  阅读(182)  评论(0)    收藏  举报