单例模式
#include <iostream>
class Singleton
{
public:
// 获取Singleton实例的静态方法
static Singleton& get()
{
static Singleton instance;
return instance;
}
// 一个示例成员函数
void hello()
{
std::cout << "Hello, Singleton!" << std::endl;
}
// 禁止外部通过构造函数、拷贝构造函数和赋值运算符创建新的实例
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
private:
// 私有构造函数确保不能从外部创建实例
Singleton() {}
};
int main()
{
// 通过静态方法访问Singleton实例并调用hello方法
Singleton::get().hello();
return 0;
}
在这个场景中,static Singleton& get()
函数被定义为返回一个 Singleton
类型的引用,并且这个函数本身也被声明为 static
。这样设计有几个关键原因:
-
静态成员函数:
static
关键字在这里表明get()
是一个静态成员函数。静态成员函数可以在没有创建类的实例的情况下被调用。这对于实现单例模式非常重要,因为单例模式的目标是控制对象的创建,确保整个程序中只创建一个实例。 -
返回引用:函数返回类型为
Singleton&
,意味着返回的是一个对Singleton
实例的引用。使用引用的原因是我们希望直接返回单例对象本身,而不是它的一个副本。这确保了无论何时调用get()
方法,返回的都是对同一个Singleton
实例的引用。 -
保证单例:通过在
get()
函数内部声明一个静态局部变量static Singleton instance;
,我们确保了这个类的实例只会被创建一次。静态局部变量的初始化仅在第一次访问函数时进行,之后的访问会返回同一个实例。这是实现单例模式的关键技巧之一。
static Singleton& get()
函数的设计确保了这个类遵循单例模式的要求,即整个程序中只有一个该类的实例,且易于从任何地方访问这个实例。