Skip to content

单例模式

回到目录

参考链接

简介

  1. 介绍 单例模式就是保证一个类仅有一个实例,并提供一个访问它的全局访问点。特点有:

  2. 在任何情况下,单例类永远只有一个实例存在

  3. 单例需要有能力为整个系统提供这一唯一实例

所以说需要做

  • 构造函数应该声名为私有
  • 拷贝构造、赋值构造、移动构造都应该禁止

  • 适用场景

打印机,任务管理器等等

UML类图

示例

懒汉式

简单示例,懒汉就是只有用到的时候才会创建,不支持多线程,优化需要加互斥锁

class CSingleton  
{
public:
  static CSingleton* GetInstance() {  
    if ( m_pInstance == NULL )
      m_pInstance = new CSingleton();
    return m_pInstance;
  }
private:
  CSingleton() {};
  static CSingleton * m_pInstance;
}

饿汉式

简单示例,饿汉就是程序开始就创建,不支持多线程,优化需要加互斥锁

class CSingleton
{
private:
  CSingleton() {}
public:
  static CSingleton * GetInstance() {
    static CSingleton instance;
    return &instance;
  }
};

最优实现

C++11起,Singleton 最佳实现是静态局部对象的方法,。优势有这些

  • 延迟加载,保证不用到就不会构造这个类,只会在第一次用到时构造,属于懒汉式
  • 该方法是线程安全的。C++11标准保证:如果多个线程试图同时初始化同一静态局部对象,则初始化严格只发生一次

缺点有:

  • gcc 4.0之后的编译器支持这种写法
  • C++11及以后的版本(如C++14)的多线程下,正确
#include <iostream>

class Singleton
{
public:
  static Singleton &get_instance() {
    static Singleton value;
    return value;
  }
  ~Singleton() {
    std::cout << "~Singleton()" << std::endl;
  }
private:
  Singleton() {
    std::cout << "Singleton()" << std::endl;
  }
  Singleton(Singleton &obj) = delete;
  Singleton(const Singleton &obj) = delete;
  Singleton(Singleton &&obj) = delete;
  Singleton(const Singleton &&obj) = delete;
  Singleton operator=(Singleton &obj) = delete;
  Singleton operator=(const Singleton &obj) = delete;
};

#define RETURN_FAIL(state, ret)          \
  if (!(state)) {                      \
    std::cout << #state << " execute failed" << std::endl; \
    return (ret);                      \
  }

int main()
{
  Singleton &signleton = Singleton::get_instance();

  return 0;
}