單例模式的三種實現方法

2021-08-10 23:11:35 字數 1703 閱讀 8741

在實際開發中,我們往往需要乙個類只能被例項化一次,如果有多個物件的話,就會導致混亂情況發生。

優點

一、例項控制

單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。

二、靈活性

因為類控制了例項化過程,所以類可以靈活更改例項化過程。

一、開銷

雖然數量很少,但如果每次物件請求引用時都要檢查是否存在類的例項,將仍然需要一些開銷。可以通過使用靜態初始化解決此問題。

二、可能的開發混淆

使用單例物件(尤其在類庫中定義的物件)時,開發人員必須記住自己不能使用new關鍵字例項化物件。因為可能無法訪問庫源**,因此應用程式開發人員可能會意外發現自己無法直接例項化此類。

三、物件生存期

不能解決刪除單個物件的問題。在提供記憶體管理的語言中(例如基於.net framework的語言),只有單例類能夠導致例項被取消分配,因為它包含對該例項的私有引用。在某些語言中(如 c++),其他類可以刪除物件例項,但這樣會導致單例類中出現懸浮引用。。

今天我們就來實現以下三個單例模式

1.懶漢式

class test

private:

test() {};

static test*p;

};

我們將類的建構函式宣告為私有的,這樣就不能通過建構函式來建立類物件,定義乙個靜態的gettest()函式來建立獲取類資源,而這個函式不需要建立類物件,只需要通過類名訪問即可。只有在第一次建立類物件時,資源進行了分配,其餘時候不進行分配。這樣就實現了乙個類只有乙個例項的要求。

缺點:存在記憶體洩露。new出來的東西始終沒有釋放。

2.餓漢式

class test 

} };

static test2 t;

public:

static test* gettest() }

};

這裡採用一種內嵌定義的方式,定義乙個test2類,專門只做一件事,就是用來釋放new出來的資源,當程式執行結束時,系統會自動析構所有的全域性變數。會自動呼叫test2的析構函式,把p的資源釋放。

餓漢式的特點是一開始就載入了,如果說懶漢式是時間換空間,那麼餓漢式就是用空間換時間。

class test

public:

test* gettest()

}

這是一種餓漢式的方法,當類被建立好了之後,就已經存在乙個靜態的物件供系統使用,以後不會再改變。但是這也會存在乙個問題,當我們使用下面的方法來呼叫的好時

test t1=test::gettest();就會出現乙個類拷貝的問題,這就違背了單例模式的要求,因為編譯器會給我們合成乙個預設的建構函式,來支援類的拷貝。最後我們沒辦法,只能將類的拷貝建構函式和賦值運算子的過載宣告為私有。於是有了下面這種**。

class test

test(const test&t);

test& operator=(const test&t);

public:

test* gettest()

}

單例模式的三種實現

class singleton public static singleton getinstance 缺點 類每次使用時都會初始化靜態成員變數 呼叫該類的其它方法時也會初始化 浪費記憶體。class singleton public static singleton getinstance ret...

c 三種單例模式實現

因為在設計或開發中,肯定會有這麼一種情況,乙個類只能有乙個物件被建立,如果有多個物件的話,可能會導致狀態的混亂和不一致。這種情況下,單例模式是最恰當的解決辦法。它有很多種實現方式,各自的特性不相同,使用的情形也不相同。今天要實現的是常用的三種,分別是餓漢式 懶漢式和多執行緒式。通過單例模式,可以做到...

python實現單例模式的三種方法

單例模式 singleton pattern 是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類只有乙個例項存在。當在整個系統中,某個類只能出現乙個例項時,單例物件就能派上用場。其目的就是令到單個程序中只存在乙個類的例項,從而可以實現資料的共享,節省系統開銷,防止io阻塞等等 方法1 使用基類...