-
单例模式:一种创建型设计模式
-
应用场景:
- 日志系统 。一个项目中应该只有一个日志系统,则应当确保日志对象只能被创建一份。
- 全局数据存储。C++中应尽量避免全局变量的使用。可以通过一个数据类专门负责存储数据,该类只存在一个实例化对象,其他各类可以在其中存储需要传递的数据。
-
实现方式:
首先,将类的构造函数、拷贝构造函数设为私有属性,则无法在类外通过
new
生成该类对象。
然后,提供一个获取类唯一实例的公有接口,外部只能通过该接口获得该类的实例化对象。
最后,在该公有接口中通过静态变量,确保该类只实例化了一次。 -
优点:
通过单例模式,可以实现类之间的数据传输,而不必写各类两两之间的通信接口,降低了代码的复杂度。
-
缺点:
单例模式的实现有多种模式,本文示范的代码并没有考虑多线程情况,在多线程下可能会生成多份实例。后续会将改进的单例模式更新在下方。
以下是单例模式的简易代码实现:
// Singleton.hpp
#include <iostream>
using namespace std;
// 日志单件类
class LogSingleton {
public:
// 对外提供获取唯一实例的接口
static LogSingleton* Instance() {
if (NULL == m_pInstance) {
// 只第一次调用此接口时创建实例化对象
m_pInstance = new LogSingleton();
}
return m_pInstance;
}
// 展示当前日志
void Look() {
printf("%s\n", strLog.c_str());
}
// 写入日志
void Write(string strNew) {
strLog += strNew;
}
// 内存回收
~LogSingleton() {
if (NULL != m_pInstance) {
delete m_pInstance;
m_pInstance = NULL;
}
}
private:
// 将构造、拷贝构造函数设为私有
LogSingleton() {}
LogSingleton(LogSingleton& oLog) {}
static LogSingleton* m_pInstance; // 指向唯一实例的指针
string strLog;
};
// 记得将static指针初始化
LogSingleton* LogSingleton::m_pInstance = NULL;
主函数中的使用
#include "Singleton.hpp"
int main()
{
LogSingleton* pUserA = LogSingleton::Instance();
pUserA->Write("Hello");
LogSingleton* pUserB = LogSingleton::Instance();
pUserB->Look();
return 0;
}
控制台输出结果
Hello