跳转至

单例模式

英文: Singleton pattern.

别名: 单例模式/单件模式.

描述

确保一个类只有一个实例, 并提供一个全局指针用于访问实例.

优点

  • 初始化顺序可控的全局变量. 全局变量初始化顺序不可控, 因此有全局变量的类的构造函数中不应该访问全局变量, 因为它们可能还未被初始化. (适用于 C++)

缺点

  • 是全局变量, 可能提高代码耦合度.
  • 并发不友好, 可能同时被多个线程读取和修改.

提示

  • 可以被继承.
  • 若初始化时间较长, 为避免性能问题, 可以提前初始化.

实现

  • 第一次获取实例时初始化, 被称为懒汉式.

初始化顺序可控, C++11及之后线程安全, C++11之前线程不安全.
出处: 该方法由 Scott Meyer 在 Effective C++ 一书中提出.

class Singleton
{
public:
  Singleton(const Singleton&) = delete;
  Singleton operator=(const Singleton&) = delete;

  static Singleton& get()
  {
    static Singleton instance;
    return instance;
  }

private:
  Singleton() = default;
};
  • 作为全局变量初始化, 被称为饿汉式.

初始化顺序不可控, 线程安全.

class Singleton
{
public:
    static Singleton& get()
    {
        return *instance;
    }

private:
    Singleton() = default;

    static Singleton *instance;
};

Singleton* Singleton::instance = new Singleton();

评论