題目2 實現Singleton模式

2021-08-16 01:51:31 字數 1689 閱讀 2512

只能生成乙個例項的類是實現了singleton(單例)模式的型別。由於設計模式在物件導向程式設計中起著劇組輕重的作用,在面試過程中很多公司都喜歡問一些與設計模式相關的問題。在常用模式中, singleton是唯一乙個能夠用短短幾十行**完整實現的模式。因此,寫乙個singleton的型別是乙個很常見的面試題。

1 乙個簡單的單例模式:建構函式宣告為private或protect防止被外部函式例項化,內部儲存乙個private static的類指標儲存唯一的例項,例項的動作由乙個public的類方法代勞,該方法也返回單例類唯一的例項。

**:

class singleton

private:

static singleton* p;

public:

singleton* instance();

} ;singleton* singleton::p = null;

singleton* singleton::instance()

上述方法雖然簡單易懂,但是當多個執行緒進行訪問時,執行緒並不安全,考慮兩個執行緒同時首次呼叫instance方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤!同時,這也不是單例的唯一實現!

2 懶漢與餓漢

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

特點與選擇:

3 執行緒安全的懶漢實現

執行緒不安全,怎麼辦呢?最直觀的方法:加鎖。

方法1:加鎖的經典懶漢實現:

class singleton

private:

static singleton* p;

public:

static pthread_mutex_t mutex;

static singleton* instance();

};pthread_mutex_t singleton::mutex;

singleton* singleton::p = null;

singleton* singleton::instance()

return p;

}

方法2:內部靜態變數的懶漢實現

此方法也很容易實現,在instance函式裡定義乙個靜態的例項,也可以保證擁有唯一例項,在返回時只需要返回其指標就可以了。推薦這種實現方法,真得非常簡單。

class singleton

public:

static pthread_mutex_t mutex;

static singleton* instance();

};pthread_mutex_t singleton::mutex;

singleton* singleton::instance()

4 餓漢實現

餓漢本身就是執行緒安全的,以空間換時間。。。。。。

class singleton

private:

static singleton* p;

public:

static singleton* instance();

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

singleton* singleton::instance()

實現singleton模式2

package swordoffre.gaopengyu 劍指offer2題 實現singleton模式 public class singleton2 private static singleton2 singleton new singleton2 public static singleto...

C 用多種方式實現Singleton單例模式

題目 設計乙個類,只能生成該類的乙個例項。1 解法一 只適用於單執行緒環境 由於要求只能生成乙個例項,因此我們必須把建構函式設為私有函式以禁止他人建立例項。我們可以定義乙個靜態的例項,在需要的時候建立該例項。public class singleton1 private static singlet...

面試題2 實現Singleton模式

題目 設計乙個類,我們只能生成該類的乙個例項。只能生成乙個例項的類是實現singleton 單例 模式的型別。由於設計模式在物件導向程式設計中起著舉足輕重的作用,面試中經常會出現這樣的面試題。不好得解決方法一 只適用於單執行緒環境 public sealed class singleton priv...