1、单例模式:
构造函数私有,通过static的接口函数向外提供单例的访问。
2、单例模式的不同实现方式:
2.1、动态构造单例,垃圾回收析构:
class Singleton
{
public:
static Singleton* GetInstance()
{
if (m_Instance == nullptr) { // 判断是否第一次调用
m_Instance = new Singleton();
}
return m_Instance;
}
~Singleton();
private:
Singleton() { static CGarbo Garbo; }
static Singleton* m_Instance;
class CGarbo
{
public:
~CGarbo() {
if (Singleton::m_Instance) {
delete Singleton::m_Instance;
Singleton::m_Instance = nullptr;
}
}
};
};
Singleton* Singleton::m_Instance = nullptr; // 私有的静态成员变量也可以在类外初始化
2.2、需要垃圾回收机制的原因:
- 使用new创建的(类)对象,在离开作用域时,该(类)对象的析构函数不被自动调用,而需要调用delete主动触发析构函数。
- 因此没有垃圾回收机制的动态构造单例,在程序结束时析构函数不被调用,内存不会被释放。
- 利用静态变量在程序结束时析构,在其析构函数中主动调用单例模式的delete函数,完成单例的析构。
参考资料:
1、为什么需要带垃圾回收机制的单例模式
2、常见单例与带垃圾回收机制的单例模式代码
3、为什么new的单例离开作用域析构函数不被调用
2.3、采用静态变量创建单例,自动析构:
class Singleton
{
public:
static Singleton& getInstance()
{
static Singleton instance;
return instance;
}
void func() { cout<<"Singleton"<<endl; }
private:
Singleton(){}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
int main()
{
Singleton& mysingleton = Singleton::getInstance();
mysingleton.func();
getchar();
return 0;
}
参考资料:
1、静态变量创建单例
3、多件模式:
在类中有一个map对象保存键值与对应实例的指针。通过static的接口函数访问实例时,先利用传入的key查询是否已有该实例,有则直接返回,无则创建后,保存在map中并返回。