單例模式,故名思義,其意圖是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有的程式模組共享.在很多地方要用到這種設計模式,如系統的日誌輸出,作業系統的視窗,乙個pc連乙個鍵盤等.
單例模式有許多實現方法.
第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項,
需要加鎖,因為可能會有多個執行緒進入判斷例項是否存在的if語句,從而它是非執行緒安全的.使用double-check(即兩次判斷例項是否存在,原因見**注釋.),同時,如果處理大量資料,該鎖成為嚴重的效能瓶頸.
#include
#include
class singleton
; // singleton(const singleton &);
// singleton& operator = (const singleton &);
public:
static singleton *instantialize();
static singleton *pinstance;
static
std::mutex mut;
};singleton* singleton::pinstance = null; //靜態變數要在類外進行初始化或在類外進行宣告.
std::mutex singleton::mut; //在類外宣告但不進行初始化.
singleton * singleton::instantialize()
}return pinstance;
}int main(int argc,char *argv)
#include
#include
#include
class
singleinside
public:
static singleinside& getinstance()
};int main(int argc,char *argv)
執行結果:
single
:0x7ffd1ef69d98
single1
:0x7ffd1ef69da8
從結果可以看出,兩個例項的位址不同此方法每次呼叫getinstance()方法,都會進行例項的拷貝.
即無論是否呼叫該類的例項,在程式開始時就會產生乙個該類的例項,並在以後僅返回此例項。
由靜態初始化例項保證其執行緒安全性,為什麼呢?因為靜態例項初始化在程式開始時進入主函式之前就由主線程以單執行緒方式完成了初始化,不必擔心多執行緒問題。
#include
class singletonstatic
public:
static
const singletonstatic* getinstance()
};const singletonstatic* singletonstatic::m_instance = new singletonstatic;
int main(int argc,char *argv)
執行結果:
p1
:0xf07010
p2:0xf07010
我們知道,程式在結束的時候,系統會自動析構所有的全域性變數。事實上,系統也會析構所有的類的靜態成員變數,就像這些靜態成員也是全域性變數一樣。利用這個特徵,我們可以在單例類中定義乙個這樣的靜態成員變數,而它的唯一工作就是在析構函式中刪除單例類的例項.
#include
#include
class csingleton
static csingleton* m_pinstance;
static
std::mutex mtx;
class gc}};
static gc gc;
public:
static csingleton *getinstance()
}return m_pinstance;
}};csingleton::gc csingleton::gc;
csingleton* csingleton::m_pinstance = null;
std::mutex csingleton::mtx;
int main(int argc,char *argv)
執行結果:
p1
:0x911010
p2:0x911010
C 設計模式之單例模式
在遊戲開發過程中,我們時常會遇到單例模式的運用場景。比如你遊戲當中的最終boss,你希望你的boss只能有乙個,所以這裡你就可以用單例模式 那麼什麼是單例模式呢?看下面的 分析。include include using namespace std class singleton public st...
C 設計模式之單例模式
設計模式是以理論的高度,總結了開發過程中的一多種不同的方法,在各種設計模式中,它們都有著不同實現方式,所起的作用也不相同,我最近看了部分設計模式,主要是以我自己的理解來闡述對它們的看法。我們可以看到單例的大概實現是很簡單的。幾個需要注意的地方是 只有當我們的建構函式為私有時,此時,我們在類外部就不能...
c 設計模式之單例模式
單例模式概念 單例模式事比較常用的設計模式之一。一般情況下,我們建立的一些類是屬於工具性質的,基本不用儲存太多的跟自身有關的資料,在這種情況下,每次都去new乙個物件,即增加了開銷,也使得 更加臃腫。其實,我們只需要乙個例項物件就可以。如果採用全域性或者靜態變數的方式,會影響封裝性,難以保證別的 不...