C 單例模式的幾種實現方式

2022-05-15 01:59:01 字數 1702 閱讀 7533

一、多執行緒不安全方式實現

1

public

sealed

class

singleinstance25

public

static

singleinstance instance613

return

instance;14}

15}16 }

sealed表示singleinstance不能被繼承。其實建構函式私有化已經達到了這個效果,私有的建構函式不能被繼承。為了可讀性,可以加個sealed。私有化建構函式的另乙個作用是讓當前類不能被例項化,只能通過成員方法獲取到類的例項。

不安全的單例指的是在多執行緒環境下可能有多個執行緒同時進入if語句,建立了多次單例物件。

二、安全的單例模式

1

public

sealed

class

singleinstance26

public

static

singleinstance instance718

}1920}

21return

instance;22}

23}24 }

加鎖保護,在多執行緒下可以確保例項值被建立一次。缺點是每次獲取單例,都要進行判斷,涉及到的鎖和解鎖比較耗資源。由此引入下一種單例模式的實現方式,採取的是以記憶體換速度的策略。

三、唯讀屬性式

1

public

sealed

class

singleinstance25

public

static

singleinstance instance611

}12 }

借助readonly屬性,instance只被初始化一次,同樣達到了單例的效果。在main函式執行第一句話之前,instance其實已經被賦值了,並不是預期的當訪問instance變數時才建立物件。

四、使用lazy

1

public

sealed

class

singleinstance25

public

static

singleinstance instance611

}12 }

lazy預設是執行緒安全的。msdn描述如下:

翻譯過來就是:

是否可以從多個執行緒訪問延遲初始化的物件? 如果是這樣,lazy 物件可能會在任何執行緒上建立它。 您可以使用其中乙個簡單建構函式,其預設行為是建立乙個執行緒安全的lazy 物件,這樣無論有多少執行緒嘗試訪問它,都只會建立乙個延遲例項化物件的例項。 要建立非執行緒安全的lazy 物件,必須使用能夠指定無線程安全性的建構函式。

1

public

class singletonwhere t:new()2

89public

t getinstance()

1019}20

}21return

instance;

22}

23 }

泛型單例模式配合工廠模式使用更佳,可以對任意滿足要求的物件實現單例。

部分**自 

單例模式實現的幾種方式

單例模式三個主要特點 1 構造方法私有化 2 例項化的變數引用私有化 3 獲取例項的方法共有。package com.ctl.singleton 懶漢式單例 該模式的特點是類載入時沒有生成單例,只有當第一次呼叫 getlnstance 方法時才去建立這個單例 注意 如果編寫的是多執行緒程式,則不要刪...

單例模式的幾種實現方式

單例模式莫過於是我們最常用的設計模式之一了,它的優缺點就是 優也單例,缺也單例 當然應用它方面優點還是較多些的,所以下面我們看看,常用的幾種實現方式有哪些吧。這種是最基本的實現方式,最大的問題就是不支援多執行緒,由於沒有加鎖,嚴格上並不算單例模式。public class singleton pub...

單例模式的幾種實現方式

public class person private person person new person 出現stackoverflowerror錯誤 因為建立物件需要呼叫構造方法執行 構造方法執行在棧記憶體中 每次建立物件需要載入屬性 該屬性又是當前類物件 造成無限迴圈建立物件 最終棧記憶體壓滿 ...