C 07設計模式之單例模式

2021-09-18 02:51:56 字數 3640 閱讀 6974

設計模式是一套被反覆使用、多數人知曉的、經過分類的、**設計經驗的總結。

使用設計模式的目的:為了**可重用性、讓**更容易被他人理解、保證** 可靠性。

設計模式代表了最佳的實踐,是軟體開發人員在軟體開發過程中面臨的一般問題 的解決方案。這些解決方案是眾多軟體開發人員經過相當長的一段時間的試驗和 錯誤總結出來的。

1.保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

2.單例模式,顧名思義,即單個例項的模式。既然是物件導向,那麼乙個類只允許 產生乙個例項物件的話,就是單例模式。類物件有且只有乙個,任何使用該類的人在不改變原始碼的前提下都不能生成第二 個物件。單例模式就是乙個類只能被例項化一次 ,更準確的說是只能有乙個例項 化的物件的類。

3.單例模式的標準定義:單例模式確保某乙個類只有乙個例項,而且自行例項化並 向整個作業系統提供這個例項,這個類成為單例類,它提供全域性的訪問方法。

4.單例模式的三個要點:

• 單例類只能有乙個例項

• 它必須自行建立這個例項

• 它必須自行向整個系統提供提供這個例項

從具體實現角度來說,就是以下三點:

• 單例模式的類只提供私有的建構函式

• 類定義中含有乙個該類的靜態私有物件

• 該類提供了乙個靜態的公有方法用於建立或獲取它本身的靜態私有物件

私有物件 單例大約有兩種實現方法:懶漢 與 餓漢。

• 懶漢模式: 當第一次使用時才建立乙個唯一的例項物件,從而實現延遲載入 的效果。

csdn:

懶漢單例模式(非執行緒安全版本)

//********************===懶漢單例模式(非執行緒安全版本)*************************

class csingleton

return msin;

} // 定義內嵌類,專職處理類例項的銷毀

class cdestroy }};

static cdestroy mdel;

private:

static csingleton * msin;

// 建構函式私有化

csingleton() };

// 懶漢模式初始化不定義類例項,直到需要使用時才呼叫公共介面建立

csingleton* csingleton :: msin = null;

csingleton::cdestroy mdel;

int main()

懶漢單例模式(執行緒安全版本):普通互斥鎖版本

//********************===懶漢單例模式(執行緒安全版本):普通互斥鎖版本*************************

class csingleton

// 解鎖

pthread_mutex_unlock(&mutex);

cout << "unlock()" << endl;

return msin;

} class cdestroy}};

static cdestroy mdel;

private:

csingleton()

static csingleton* msin;

static pthread_mutex_t mutex;

};csingleton* csingleton::msin = null;

pthread_mutex_t csingleton::mutex = pthread_mutex_initializer; // 初始化互斥鎖

csingleton::cdestroy mdel;

int main()

懶漢單例模式(執行緒安全版本優化):雙重校驗鎖

//********************===懶漢單例模式(執行緒安全版本優化):雙重校驗鎖*************************

class csingleton

pthread_mutex_unlock(&mutex);

cout << "unlock()" << endl;

} return msin;

} class cdestroy}};

static cdestroy mdel;

private:

csingleton()

static csingleton* msin;

static pthread_mutex_t mutex;

};csingleton* csingleton::msin = null;

pthread_mutex_t csingleton::mutex = pthread_mutex_initializer;

csingleton::cdestroy mdel;

int main()

內部靜態變數保證執行緒安全

// ***************==內部靜態變數保證執行緒安全*************************====

#include #include using namespace std;

class csingleton

~csingleton()

private:

csingleton()

static pthread_mutex_t mutex;

};pthread_mutex_t csingleton::mutex = pthread_mutex_initializer;

int main()

• 餓漢模式: 程式啟動時就建立乙個唯一的例項物件,即單例類定義的時候就 進行例項化。 餓漢單例模式

建構函式私有化

類定義時便建立例項

私有的靜態類指標指向類的例項(類外宣告)

公有的靜態方法去獲取乙個訪問例項的訪問點

定義乙個靜態的巢狀類物件的析構函式去析構單例物件,待程式結束銷毀類 例項

//********************===餓漢單例模式*************************

class csingleton

// error ,主函式需顯式delete指標,呼叫析構,析構函式中delete再次呼叫析構,迴圈遞迴。

/*~csingleton()

*/ // 定義內嵌類,專職處理類例項的銷毀

class cdestroy }};

// 定義靜態類物件,程式結束呼叫該類析構函式,析構全域性唯一的類例項

static cdestroy mdel;

private:

static csingleton * msin;

// 建構函式私有化

csingleton() };

// 餓漢模式,在類定義時就初始化類例項

csingleton* csingleton :: msin = new csingleton();

csingleton::cdestroy mdel;

int main()

單例模式的適用場景 • 系統只需要乙個例項物件,或者考慮到資源消耗的太大而只允許建立乙個物件。 • 客戶呼叫類的單個例項只允許使用乙個公共訪問點,除了該訪問點之外不允許 通過其它方式訪問該例項(就是共有的靜態方法)。

C 設計模式之單例模式

在遊戲開發過程中,我們時常會遇到單例模式的運用場景。比如你遊戲當中的最終boss,你希望你的boss只能有乙個,所以這裡你就可以用單例模式 那麼什麼是單例模式呢?看下面的 分析。include include using namespace std class singleton public st...

C 設計模式之單例模式

設計模式是以理論的高度,總結了開發過程中的一多種不同的方法,在各種設計模式中,它們都有著不同實現方式,所起的作用也不相同,我最近看了部分設計模式,主要是以我自己的理解來闡述對它們的看法。我們可以看到單例的大概實現是很簡單的。幾個需要注意的地方是 只有當我們的建構函式為私有時,此時,我們在類外部就不能...

C 設計模式之 單例模式

單例模式,故名思義,其意圖是保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有的程式模組共享.在很多地方要用到這種設計模式,如系統的日誌輸出,作業系統的視窗,乙個pc連乙個鍵盤等.單例模式有許多實現方法.第一次呼叫該類例項的時候才產生乙個新的該類例項,並在以後僅返回此例項,需要加鎖...