單例模式 Singleton pattern

2022-03-21 02:12:59 字數 2825 閱讀 1709

單例模式特點:

1 :單例類只可有乙個例項。

2 :單例類必須自己建立自己這惟一的例項。

3 :單例類必須給所有其他物件提供這一例項。

建立單例常用的方式:

1:靜態變數法,也叫惰性例項化;

2:雙重鎖定。

第一:靜態變數法

這種方式非常好理解,.net的執行機制決定了靜態變數可以形成單件,靜態變數是乙個儲存在記憶體中的變數。它的機制可以保證同一時間只會存在乙個變數。為此我們非常容易的可以寫出這樣的程式:

1:這種對於單執行緒執行的程式來說是絕對沒有問題的,例如執行乙個 asp.net程式,一般**都基本用不到多執行緒,所有上面的例子就足夠滿足。但是如果是多執行緒呢?如果同時有兩個線開始判斷 instance==null,如果此時都為真,則建立了兩上例項,這樣就違背了單件的原則。為此可進行下修改:(非執行緒安全的單例模式)

public

class

singleton

//////

生成例項方法

/// ///

public

static

singleton getinstance()

return

instance;}}

2:這種方法在程式初始化時對類例項進行了初始化,利用靜態變數以及私有構造方法完成了單件的生成。之所以稱這種方式是惰性例項化,是因為無論你是否呼叫這個例項,它都會被建立。

public

class

singleton

//////

生成例項方法

/// ///

public

static

singleton getinstance()

#endregion

}

第二:雙重鎖定:我們可以對方法1進行下改造,它的缺點就是非執行緒安全,既然有缺點當然就要改正了。

3:

這個方法是線程式安全的單件模式,但是它每次生成單件的時候都要給物件加鎖,這樣也是一種效能消耗.上面說了有缺點就要改,這個方法當然也不例外:

public

class

singleton

//////

生成例項方法

/// ///

public

static

singleton getinstance()

return

instance;}}

#endregion

}

4:這個方法在生成的例項的時候,先判斷是否為空,如果不為空則不對物件進行加鎖操作直接返回物件例項。同時這種雙重鎖定對比靜態方法來看,有乙個優勢就是它的例項化延遲到類中,只有呼叫此類的例項時它才會生成例項.。  

public

class

singleton

//////

生成例項方法

/// ///

public

static

singleton getinstance()}}

return

instance;

}#endregion

}

小結:上面都是常規的單件模式,其實並不是所有的情況都如上面一樣。在抽象工廠的應用中經常結合單件模式來應用,使得工廠例項是唯一的。在 用抽象工廠模式武裝新聞元件  中,我用上了抽象工廠,當時在抽象工廠類例項的生成上並沒有結合單件模式,所在在這想改造一下。我的程式思路是這樣的,有乙個抽象工廠基類abstractfactoryclass,它包含乙個public static abstractfactoryclass getinstance()方法,作用是生成它的派生類的例項,而這個生成過程是通過反射來完成。這兩個派生類分別是:abstractfactory_china,abstractfactory_us.這種情況下要想直接返回abstractfactoryclass的例項是不可能的,因為它是抽象類,不能直接new abstractfactoryclass()。先看下這三個類的類圖:

**如下:**因為基類是抽象類所有沒有上面常規程式中的私有建構函式,這種生成抽象工廠類派生類例項的案例並不適用於靜態方法構造單件的情況,因為你不能直接通過new的方式來初始化類例項。

//

把抽象類設定成靜態變數,避免多次引導程式集

private

static abstractfactoryclass instance=null

;

//////

建立乙個object物件,同樣它也是靜態唯讀,用來實現鎖定功能

/// private

static

readonly

object olock = new

object

();

public

static

abstractfactoryclass getinstance()}}

return

instance;

}

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例模式 懶漢式單例模式

單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...