設計模式 單例模式 建立型模式

2022-02-10 16:43:00 字數 1391 閱讀 6977

單例模式用於在整個軟體系統當中保持唯一例項,在 c# 當中最能夠體現此概念的就是靜態類,靜態類的生命週期是跟隨整個程式,並且在整個程式中僅保有乙個例項。

不過在這裡我們不再詳細闡述單例模式與靜態類有什麼區別,如果有興趣的話可以檢視 這篇博文 和 這篇博文。

這裡說一下個人的理解:

為了保證我們的物件是全域性唯一的,那麼我們肯定不能夠通過 new 來建立單例物件,所以我們首先要將其建構函式設為私有的,其次我們肯定要有乙個 static 欄位來儲存我們唯一的例項化物件。

既然不能通過 new 來例項化物件,則需要提供乙個全域性訪問點。下面我們就來看一下具體實現:

public class singletonimplementation

public static singletonimplementation getinstance()

}

實現起來是相當簡單的,這裡我們將建構函式設定為私有的,然後通過getinstance方法來取得物件的例項。其實這裡可以改用乙個靜態屬性來實現,更加方便。

如果考慮到執行緒安全的話,就需要加乙個 locker 來保證訪問不會重複建立物件。因為如果在多執行緒環境當中呼叫這個靜態類的時候,可能在同一時間都會訪問到 m_instance,這個時候 m_instance 都為空的情況下就會連續建立兩次例項,這就違背了初衷。最簡單的方法就是加鎖,讓 m_instance 在同一時間只能乙個執行緒訪問這個物件。

public class singletonimplementation

public static singetonimplementation instance

return m_instance;}}

}

不過這樣又產生了另外乙個問題,如果執行緒每次訪問 instance 都會對 _locker 加鎖後在訪問例項是否存在,這樣對效能影響十分嚴重。這裡我們可以使用 雙重檢查鎖定模式 來實現。

雙重檢查鎖定模式(也被稱為"雙重檢查加鎖優化","鎖暗示"(lock hint)[1])

是一種軟體設計模式用來減少併發系統中競爭和同步的開銷。雙重檢查鎖定模式

首先驗證鎖定條件(第一次檢查),只有通過鎖定條件驗證才真正的進行加鎖邏輯

並再次驗證條件(第二次檢查)。

也就是說我們首先驗證 m_instance 是否為空,如果為空的話再進行加鎖執行邏輯,否則的話直接返回已經例項化成功的 m_instance。

public class singetonimplementation

public static singetonimplementation instance

}return _instance;

}}

設計模式 建立型模式 單例模式

類載入時建立物件 常量 class eagersingleton public static eagersingleton getinstance 延遲載入 假如在某一瞬間 執行緒a 和 執行緒b 都在呼叫getinstance 方法,此時instance物件為null值,均能通過instance ...

設計模式建立型模式 單例模式

單例模式 singletonparrten 保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點 建立單例模式需要三方面操作 1.建立乙個物件 2.定義乙個私有構造方法 禁止外部類對其進行例項化 3.提供乙個對外訪問的方法 單例模式可以通過懶漢式和餓漢式來實現。懶漢式 執行緒不安全 懶漢式 單例模...

設計模式 建立型模式 單例模式

優點 缺點頻繁使用 建立與銷毀 資源占用較多,例項化消耗大且耗時長,通過共享單例,加快物件的訪問速度 類要求只生成乙個例項的場景 需要單一控制邏輯的操作。具體如 多執行緒執行緒池 網路連線池 訪問資料庫或者檔案的物件等等。結構主要角色 實現 懶漢式實現 實現特點 該模式的特點是類載入時沒有生成單例,...