singleton.h
#pragma once
#include <mutex>
//懒汉模式
/*懒汉式单例模式是用时间换取空间,饿汉式单例模式是用空间换取时间。
饿汉式:单例对象无论用或不用,程序启动即创建;
懒汉式:单例对象在用的时候再创建,不用即销毁。*/
template <typename T>
class Singleton
{
public:
static T* Instance()
{
if (_instance == nullptr)
{
std::unique_lock<std::mutex> lock(_mutex);
if (_instance == nullptr)//判断是否第一次调用
_instance = new T();
}
return _instance;
}
static void Release()
{
if (_instance != nullptr)
{
delete _instance;
_instance = nullptr;
}
}
protected:
Singleton(void) {}
virtual ~Singleton(void) {}
static T* _instance;
static std::mutex _mutex;
};
template <typename T> T* Singleton<T>::_instance = nullptr;
template <typename T> std::mutex Singleton<T>::_mutex;
main.cpp
#include "singleton.h"
#include <iostream>
using namespace std;
class Client : public Singleton<Client> {
public:
void Init() {
cout << "Init" << endl;
}
};
int main()
{
Client::Instance()->Init();
return 0;
}