只能生成乙個例項的類是實現了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...