单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
单例模式的主要目的是限制一个类只能有一个实例,并提供一个访问该实例的全局访问点。这样可以确保在整个应用程序中,只有一个实例存在,避免了多个实例带来的资源浪费和冲突。
单例模式的实现通常包括以下几个要素:
1. 私有的构造函数:通过将构造函数设为私有,防止外部代码创建实例。
2. 静态成员变量:在类中定义一个静态成员变量,用于保存实例。
3. 静态访问方法:提供一个静态的访问方法,用于获取实例。该方法通常为 getInstance()。
单例模式的优点包括:
1. 全局访问:可以在任何地方访问单例实例,方便共享和调用。
2. 节省资源:由于只有一个实例存在,可以避免重复创建和销毁对象,节省了系统资源。
3. 数据共享:单例模式可以提供一个中心化的数据共享点,方便多个模块之间共享数据。
然而,单例模式也有一些缺点:
1. 违反单一职责原则:单例模式将实例化和全局访问的职责合并到一个类中,可能导致该类的职责过重。
2. 线程安全性:在多线程环境下使用单例模式时,需要考虑线程安全的问题,确保只有一个实例被创建。
在实际应用中,单例模式常用于需要全局共享的对象,例如日志记录器、数据库连接池、配置管理器等。
总结起来,单例模式通过限制一个类只能有一个实例,并提供全局访问点,确保在整个应用程序中只有一个实例存在。它在某些场景下非常有用,但也需要注意线程安全性和职责分离的问题。
// singleton_pattern.cpp
// 运行程序
// gcc singleton_pattern.cpp -o singleton_pattern && ./singleton_pattern
// 输出结果 object值一致即可
// Hello, I am a singleton object: 0x555555558152
// Hello, I am a singleton object: 0x555555558152
#include <iostream>
#include <thread>
class Singleton
{
public:
static Singleton &getInstance()
{
static Singleton instance;
return instance;
}
void showMessage()
{
std::cout << "Hello, I am a singleton object: " << this << std::endl;
}
// 禁止拷贝构造函数和赋值运算符
Singleton(const Singleton &) = delete;
Singleton &operator=(const Singleton &) = delete;
private:
// 私有构造函数,防止外部创建实例
Singleton() {}
};
int main(int argc, char *argv[])
{
Singleton &instance = Singleton::getInstance();
instance.showMessage();
std::thread my_thread = std::thread([](){
Singleton &instance = Singleton::getInstance();
instance.showMessage();
});
my_thread.join();
return 0;
}