懒汉模式
#include <mutex>
#include <iostream>
using namespace std;
template<class T>
class A {
public:
A(A&) = delete;
A& operator=(const A&) = delete;
static T* Instance();
static T* p;
static mutex mu;
protected:
A() = default;
};
template<class T>
T* A<T>::p = NULL;
template<class T>
mutex A<T>::mu;
template<class T>
T* A<T>::Instance() {
if (p == NULL) {
mu.lock();
if (p == NULL) {
T* t = new T;
p = t;
}
mu.unlock();
}
return p;
}
int main() {
int* ptr = A<int>::Instance();
return 0;
}
饿汉模式
#include <mutex>
#include <iostream>
using namespace std;
template<class T>
class A {
public:
A(A&) = delete;
A& operator=(const A&) = delete;
static T* Instance();
static T* p;
protected:
A() = default;
};
template<class T>
T* A<T>::p = new T;
template<class T>
T* A<T>::Instance() {
return p;
}
int main() {
int* ptr = A<int>::Instance();
return 0;
}