跳转至

单例模式

英文: 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();
    

评论