單例模式
注意:單例模式會讓程序變得難以測試,所以儘可能不要使用單實例模式。
保證一個類只有一個實例,並且提供了訪問該實例的全局訪問點。
線程安全的單例模式-C++11
Singleton.h
#pragma once
template<typename T>
class Singleton
{
public:
static T& instance() {
static T instance{ token{} };
return instance;
}
Singleton(const Singleton&) = delete;
Singleton& operator= (const Singleton) = delete;
protected:
struct token {};
Singleton() {}
};
Example
#include <Singleton.h>
#include <iostream>
class Test final : public Singleton<Test>
{
public:
Test(token) { std::cout << "constructed" << std::endl; }
~Test() { std::cout << "destructed" << std::endl; }
void use() const { std::cout << "in use" << std::endl; };
};
int main()
{
// Test cannot_create; /* ERROR */
std::cout << "Entering main()" << std::endl;
{
auto const& t = Test::instance();
t.use();
}
{
auto const& t = Test::instance();
t.use();
}
std::cout << "Leaving main()" << std::endl;
}
隱患
如果單例類位於 dll 庫中,是否還能保證唯一?
參考文獻
1.https://codereview.stackexcha...
2.https://stackoverflow.com/que...
3.https://gameprogrammingpatter...
4.https://gpp.tkchu.me/singleto...
更新地址
C++11單例模式(線程安全)