設計模式之單例模式

2021-07-30 00:23:10 字數 1685 閱讀 1275

@(設計模式)[設計模式, c++實現]

內部靜態變數的懶漢實現

餓漢的單例模式

乙個很容易想到的單例模式的實現:

建構函式宣告為private或protected,防止外部函式將其實例化,內部儲存乙個private static類指標儲存唯一的例項,再由乙個public函式返回該例項。

class singleton

private:

static singleton* p;

public:

static singleton* instance();

};singleton* singleton::p = null;

singleton* singleton::instance()

該實現簡單易懂,但是並不是執行緒安全的單例模式,因為假如兩個執行緒同時呼叫instance()函式,同時發現p==null,並同時構造乙個新的例項並賦值給p,這樣不僅實現了兩個例項,還讓兩個執行緒獲得了不同的例項,顯然是錯誤的。

懶漢的單例模式:不到迫不得已就不去例項化類,也就是第一次呼叫的時候才會例項化類(上面的實現也是懶漢單例模式)。

想實現執行緒安全的單例模式由兩種辦法:1.加鎖,2.使用內部靜態變數

也就是對p加鎖,防止同時訪問。

class

singleton

private:

static singleton* p;

public:

static pthread_mutex_t mutex;

static singleton* initance();

};pthread_mutex_t singleton::mutex;

singleton* singleton::p = null;

singleton* singleton::initance()

return p;

}

在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。值得注意的是,在c++0x之前,編譯器並沒***內部靜態變數的執行緒安全,所以也需要加鎖,但在c++0x之後就不用了。

class singleton

public:

static pthread_mutex_t mutex;

static singleton* initance();

int a;

};pthread_mutex_t singleton::mutex;

singleton* singleton::initance()

由靜態初始化例項保證其執行緒安全性:

靜態例項初始化在程式開始時進入主函式之前就由主線程以單執行緒方式完成了初始化,不必擔心多執行緒問題。

故在效能需求較高時,應使用這種模式,避免頻繁的鎖爭奪。

class singleton

private:

static singleton* p;

public:

static singleton* initance();

};singleton* singleton::p = new singleton;

singleton* singleton::initance()

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會23種設計模式並且會熟練運用的人,真的就是大師級的牛人了,設計模式是乙個專案主管或者架構師一定要會的東西...

設計模式之單例模式

package com.xie.singleton public class singleton 提供乙個共有的靜態的入口方法 public static singleton getinstance 懶漢式 延遲載入 提供乙個私有的靜態的成員變數,但不做初始化 private static sing...

設計模式之 單例模式

單例模式 singleton 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式 單件模式 使用方法返回唯一的例項 public class singleton private static singleton instance public static singleton geti...