單例模式是面試官非常愛考的一種設計模式。當我第一次接觸的時候,感覺這是個什麼鬼?不過自己還是堅持下來,下面是我關於這個模式的一些思路和想法。
1.單例模式的概念:
- 通俗點來說,一個類只能創建一個對象即爲單例模式。
在很多時候,爲了更安全,可靠的訪問某個服務器的話,就必須要設計出一個獨立的對象去訪問它,而其他對象則不能夠進行訪問。
單例模式的實現主要有兩種方式:餓漢模式和懶漢模式。
2.餓漢模式
不管你用或者不用,程序啓動的時候就會創建唯一的一個對象。
如果這個單例對象在多線程高併發環境下頻繁使用,性能要求較高,那麼顯然使用餓漢模式來避免資源競 爭,提高響應速度更好。
class Singleton
{
public:
{
static Singleton* GetInstance()
{
return &instance;
}
}
private:
{
Singleton(){};
Singleton(Singleton conat&)
{}
Singleton& operator=(singleton const&)
{}
static Singleton instance;
}
};
Singleton Singleton::instance;
3.懶漢模式
如果單例對象構造時或者佔用很大的資源,比如加載插件,初始化網絡連接,讀取文件等,又或者該對象程序運行時不會用到。那麼如果在程序一開始就進行初始化的話,就會導致啓動的時候非常的緩慢。這種情況用懶漢模式更好。(延遲加載)
#include<iostream>
#include<mutex>
class Singleton
{
public:
static Singleton* GetInstance()
{
if(nullptr == instance)
{
// 注意這裏一定要使用Double-Check的方式加鎖,才能保證效率和線程安全
m_mtx.lock();
if(nullptr == instance)
{
instance == new Singleton();
}
m_mtx.unlock();
}
return instance;
}
private:
Singleton(){};
Singleton(Singleton const&)
{}
Singleton& operator=(Singleton const&)
{}
static Singleton* m_instance;
static mutex m_mtx;
};
Singleton* Singleton::m_pInstance = nullptr;
mutex Singleton::m_mtx;