我眼中的單例模式

2022-02-15 20:33:05 字數 3998 閱讀 4617

說到單例模式,網上搜尋出來的結果是多如牛毛,但這不影響我也來湊熱鬧的心情。

任何事情都是要親身去體會了,才能加深自己的理解。本著不斷學習進取的精神,我很想可以站在牛人的肩膀上,哪怕是仰視牛人的情況下,我也想發揮自己的餘熱。記錄下自己學習的足跡,權當自己未來細細回味也好。(不過說真的,自己試著去組織語言來介紹你的問題也好,你的產品也好,能在很大的程度上提高你的表達能力。大腦是越鍛鍊越活的東西,講話、寫作也一樣,持之以恆,必有收穫。總之,貴在堅持哦!)

好了,我先宣告下我參考的牛人文章出處:

下面來介紹模式,單例模式就是保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點

其實就是實現只有乙個門可以進入,且每次只給乙個人進入。這就像以前的一位博友所舉的例子,很多人排隊去廁所蹲坑一樣,每一次只能讓乙個人去蹲坑。實現單例模式的原因,要麼是資源共享,要麼是控制資源等。所謂資源共享,就是因為單例模式保證了乙個類僅有乙個例項,所以大家訪問的例項是一致的。而控制資源的話,主要是減少資源的申請與釋放等。

牛人就是牛人,一下給出了五種實現單例模式的例子。看得我茅塞頓開,大呼過癮。

第一種:簡單實現(惰性例項化)

namespace

singleton

console.read();}}

public

sealed

class

singleton

private

static singleton instance = null

;

public

static

singleton instance

return

instance;}}

}}

簡單實現對於執行緒來說是不安全的,因為在多執行緒的情況下,有可能產生多個singleton例項。多執行緒的情況下,如果多個執行緒都去判斷(instance == null),而它們都還沒有建立例項的情況下,就會產生多個singleton例項。對於簡單實現來講,singleton例項化並不是應用程式啟動就建立,所以我們把它叫做「惰性例項化」,這能避免應用程式啟動時例項化不必要的例項。

第二種:安全的執行緒

namespace

singleton

console.read();}}

public

sealed

class

singleton

private

static singleton instance = null

;

private

static

readonly

object padlock = new

object

();

public

static

singleton instance

return

instance;}}

}}

}

安全的執行緒,這是對簡單例項的補充。因為提供了加鎖lock()的操作,這就能確保只有乙個執行緒進入。但是加鎖需要增加額外的開銷,損失效能。

第三種:雙重鎖定檢查

namespace

singleton

console.read();}}

public

sealed

class

singleton

private

static singleton instance = null

;private

static

readonly

object padlock = new

object

();

public

static

singleton instance}}

return

instance;}}

}}

雙重鎖定檢查安全的執行緒上面又進行了改進,主要是考慮了每次加鎖會增加額外的開銷,影響效能。所以在加鎖前再判斷singleton有沒有被例項化。這樣,它就能減少很多的額外開銷且是執行緒安全的。實際上,應用程式很少需要上面方式的實現。這種方式仍然有很多缺點:無法實現延遲初始化。大多數情況下我們會使用靜態初始化的方式。

第四種:靜態初始化

namespace

singleton

console.read();}}

public

sealed

class

singleton

public

static

singleton instance}}

}

靜態初始化,是在 .net 中實現 singleton 的首選方法。 這段**有點意思,我也解讀一下。主要是講解下關鍵字吧。

sealed:修改類,意為這個類不可再被繼承,防止子類被例項化而不能保證只有乙個例項的問題。

private singleton():用private 修改建構函式,可以防止這個類在外部被例項。也就是在singleton類外面想new singleton()是會報編譯錯誤。

static readonly:表示只能在宣告時賦值,或是在靜態構造中賦值。

第五種:延遲初始化

namespace

singleton

console.read();}}

public

sealed

class

singleton

public

static

singleton instance}}

public

sealed

class

delay

public

static

singleton delayinstance}}

}

把例項化的工作交給delay類開實現,這樣singleton類就實現了延遲初始化。這種方式具有很多的優勢,是值得推薦的一種實現方式。但是這種方式就需要開發人員記住不能使用new關鍵字例項化singleton。

應用場景

其實不管是對於哪個設計模式來說,我們總會想知道什麼時候能用到它。畢竟東西不是白學的,是貓是狗總也得帶出來溜溜。

畢竟我也使用得少,所以這裡面為了讓網友能夠看得大而全點,我摘自博友的內容如下:

1. windows的task manager(任務管理器)就是很典型的單例模式(這個很熟悉吧),想想看,是不是呢,你能開啟兩個windows task manager嗎? 不信你自己試試看哦~

2. windows的recycle bin(**站)也是典型的單例應用。在整個系統執行過程中,**站一直維護著僅有的乙個例項。

3. **的計數器,一般也是採用單例模式實現,否則難以同步。

4. 應用程式的日誌應用,一般都可用單例模式實現,這一般是由於共享的日誌檔案一直處於開啟狀態,因為只能有乙個例項去操作,否則內容不好追加。

5. web應用的配置物件的讀取,一般也應用單例模式,這個是由於配置檔案是共享的資源。

6. 資料庫連線池的設計一般也是採用單例模式,因為資料庫連線是一種資料庫資源。資料庫軟體系統中使用資料庫連線池,主要是節省開啟或者關閉資料庫連線所引起的效率損耗,這種效率上的損耗還是非常昂貴的,因為使用單例模式來維護,就可以大大降低這種損耗。

7. 多執行緒的執行緒池的設計一般也是採用單例模式,這是由於執行緒池要方便對池中的執行緒進行控制。

8. 作業系統的檔案系統,也是單例模式實現的具體例子,乙個作業系統只能有乙個檔案系統。

至此,本文完!

我眼中的單例模式

單例模式 即記憶體只會建立乙個物件也只建立一次物件的設計模式。那為什麼我們要使用單例呢,大家都知道頻繁的建立物件會讓記憶體飆公升,而單例模式會讓記憶體只使用這乙個物件,單例模式的型別 懶漢式 好懶啊,什麼時候用我就什麼時候建立好了 只有真正使用物件的時候才會建立單例物件 餓漢式 好餓啊,趕緊建立出來...

我眼中的MVC模式

首先,我們看看維基百科上的解釋 mvc模式 model view controller 是軟體工程中的一種軟體架構模式,把軟體系統分為三個基本部分 模型 model 檢視 view 和控制器 controller mvc模式最早由trygve reenskaug在1978年提出,是施樂帕羅奧多研究中...

我理解的設計模式 單例模式

單例模式 singleton pattern 什麼是單例模式,四人幫的書裡面這麼定義 保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。可以這麼理解 在乙個程序裡,這個類只會被例項化一次,而且可以很方便的被呼叫。實現 惡漢式 載入類的時候,在類的內部定義乙個例項,外部呼叫則開放給乙個靜態函式。...