設計模式之單例模式

2021-09-06 14:19:21 字數 2231 閱讀 4067

雖然不是在設計模式中看得第乙個模式,但是這是第乙個寫部落格的模式,之前的學習的工廠模式後續再寫,這是乙個不簡單的設計模式,再我看過的設計模式中單例模式雖然沒有把物件導向的三大特性全部表現出來。但是,我感覺依然還是不容易理解的。接下來言歸正傳,說一下單例模式。

單例模式必須保證乙個類只能生成乙個例項。並提供乙個全域性的訪問點,該例項是被所有的程式所共享的。也就是說在使用這個類是只能有乙個物件產生,就像乙個全域性變數一樣,每個程式都可以使用這個變數。所以,singleton類的建立和銷毀需要類本身完成。在c++中,它的建構函式和析構函式是不能被公開呼叫的。

由於singleton類的物件的建立時間不同,模式也不相同,分為:懶漢模式和餓漢模式。

懶漢模式:

//懶漢模式--用指標實現

#include using namespace std;

class singleton

private:

singleton(){}

singleton(const singleton&){}

singleton& operator=(const singleton&){}

~singleton()

private:

static singleton* instance;

};singleton* singleton::instance = null;

int main()

然而,但多執行緒時,此例是不安全的。例如,當執行緒a進入判斷之後,被執行緒b中斷,從而執行執行緒b,執行完執行緒b之後再執行執行緒a,會使得執行緒a的條件發生變化,然而還不能再次判斷。就會再次建立乙個物件,從而就不在是單例模式了。同時,此例沒有析構,可能會存在記憶體洩漏,然而,我看到一篇部落格說,靜態指標是不會存在記憶體洩漏的,它會根據程式的退出,作業系統會清除所有的記憶體空間。

//懶漢模式--區域性靜態變數

#include using namespace std;

class singleton

private:

singleton(){}

singleton(const singleton&){}

singleton& operator=(const singleton&){}

~singleton(){}

};int main()

其實,區域性靜態初始化物件,執行緒也是不安全的的。如果初始化時有多條語句,就會使得出現多執行緒競爭問題。

餓漢模式的單例模式是在主函式之前定義了乙個全域性變數,出現的時間比較早。

//餓漢模式--區域性靜態變數

#include using namespace std;

class singleton

singleton(const singleton&){}

singleton& operator=(const singleton&){}

~singleton(){}

private:

static singleton m_instance;

};singleton singleton::m_instance;

singleton& singleton::getinstance()

int main()

餓漢模式是用空間換時間,在類外定義乙個全域性變數會浪費空間,但是實現簡單,對於多執行緒也是安全的。

//餓漢模式--區域性靜態變數

#include using namespace std;

class singleton

singleton(const singleton&){}

singleton& operator=(const singleton&){}

~singleton(){}

private:

static singleton *m_instance;

};singleton* singleton::m_instance = new singleton();

singleton* singleton::getinstance()

int main()

{ singleton* sing1 = singleton::getinstance();

singleton* sing2 = singleton::getinstance();

if(sing1 == sing2)

cout << "sing1 == sing2" <

設計模式之單例模式

前一段時間買了一本秦小波寫的 設計模式之禪 網上對這書的評價很高。現在還沒有看很多,但是有些地方頗有感觸,也並不是所有的地方都能看懂,但是會慢慢研究的。自己對於設計模式的感覺就是乙個字 牛!感覺會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...