首页 > 解决方案 > 类中的静态对象(单例)

问题描述

我正在研究单例设计模式的两种实现。

我想知道第二个是如何工作的,特别是:

  1. 为什么作者选择返回 DB 作为参考。

  2. 为什么 getDatabaseConnection() 中的静态类对象 DB 不需要在 SingleDatabase 类之外定义,如下所示:

SingletonDatabase& SingletonDatabase::DB;
  1. 像静态变量一样,静态类对象是否只创建一次(并且在同一类的所有对象之间共享)?

执行

class SingletonDatabase {
    private:
        SingletonDatabase() {
            std::cout << "Initializing database" << std::endl;
            instanceCount++; // Used in testing later on.
        }

    public:
        SingletonDatabase(const SingletonDatabase&) = delete;
        SingletonDatabase& operator=(const SingletonDatabase&) = delete;
        static SingletonDatabase& getDatabaseConnection() {
            static SingletonDatabase DB;
            return DB;
        }
        static int instanceCount;
};

int SingletonDatabase::instanceCount = 0;

我习惯于看到使用静态指针的实现,作者提到它不是线程安全的。他更喜欢这种方法。

谢谢!

标签: c++classdesign-patternsstaticsingleton

解决方案


  1. 为什么作者选择返回 DB 作为参考。

除了引用之外,还可以使用指针。该参考更好地表达了被指点对象被授予存在。(按值返回反而会破坏这个概念。)

  1. 为什么 getDatabaseConnection() 中的静态类对象 DB 不需要在 SingleDatabase 类之外定义,如下所示:

SingletonDatabase& SingletonDatabase::DB;

它不是一个成员变量,而是一个static具有局部范围的变量,而是一个静态的生命周期 → 被授予从第一次访问到进程结束的存在。

SO:C++ 函数中静态变量的生命周期是多少?(有点陈旧但仍然正确)

这将在普通函数中以相同的方式工作。周围函数是(static成员函数)与此无关。

  1. 像静态变量一样,静态类对象是否只创建一次(并且在同一类的所有对象之间共享)?

是的。

正确地说,它在此函数的任何调用者之间共享。


顺便提一句。这被称为Meyers Singleton

FleCSI: Meyer's SingletonSO: C++ Singleton 设计模式

SO:Meyers 实现的 Singleton 模式线程安全吗?


推荐阅读