設計模式三 單例模式

2021-09-07 14:07:17 字數 3266 閱讀 1432

單例模式也是建立型模式的一種,也是23種設計模式中比較簡單的一種。見名思意,在整個軟體系統中,只有某個型別的乙個物件,並且訪問他的地方也只有乙個,也就是只有乙個全域性物件訪問點,這個例項或物件被所有是應用程式所共享;很多可以使用到這樣的功能模組:比如資料庫連線池物件、印表機物件,因為整個系統中,資料庫的連線只在乙個地方連線,印表機在整個系統中也只有乙個。這種情況下,單例模式就很大的減少了乙個記憶體的開銷,因為物件的建立是比較消耗記憶體的,同時因為系統中只有乙個例項,比較容易控制,省去了物件建立的過程,更快的進行乙個響應,但是在使用單例模式時,由於只有乙個例項,所有的執行緒都可以去使用這個例項,那麼不能保證執行緒的乙個安全性,如果要想保證執行緒的安全性,我們需要使用其他的一些輔助措施。所以對於執行緒安全的物件我們最好不要使用單例模式,否則可能會降低系統的效率。單例模式只需要乙個類就可以實現,自己關聯自己,那麼如何實現呢?我們只需要將構造方法定義成私有的,這樣使用者就不能自己去建立這個物件了,然後通過乙個靜態方法和靜態變數來存放類的唯一的乙個例項。

示例:建立單例類:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

單例模式

//2.建立該類的乙個靜態變數

private

static

singleton instance;

//3.建立返回值為該型別的乙個靜態方法 (此方法對外公開)

public

static

singleton createinstance()

return

instance;}}

}

主程式呼叫:

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

system.threading.tasks;67

namespace

單例模式818

}19 }

執行結果:

從最後的結果中可以看出,例項只被建立了一次。

在來看看下面的例子:

1

for (int i = 0; i < 10; i++)

2).begininvoke(null,null

);8 }

結果:

從上面的截圖中看出建構函式被執行了三次。單例模式不是只會構造一次嗎?這裡為什麼執行了三次呢?因為這裡是多執行緒併發的,10個任務是同時開始的,可能物件不為null的時候有多個執行緒進入了,所以會執行多次。要解決這種問題,可以使用加鎖。

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

system.threading.tasks;67

namespace

單例模式818

19//

2.建立該類的乙個靜態變數

20private

static

singleton instance;

21//

建立鎖22

private

static

object singleton_lock = new

object

();23

24//

3.建立返回值為該型別的乙個靜態方法 (此方法對外公開)

25public

static

singleton createinstance()

2633}34

return

instance;35}

36}37 }

再次執行程式檢視結果:

這時只會構造乙個物件了。

在來看看懶漢式的單例模式:

1

using

system;

2using

system.collections.generic;

3using

system.linq;

4using

system.text;

5using

system.threading.tasks;67

namespace

單例模式815

16private

static singletonsecond instance = null;17

18///

19///

靜態建構函式:由clr保證在第一次使用這個類之前,呼叫而且只呼叫一次

20///

21static

singletonsecond()

2225

26public

static

singletonsecond createinstance()

2730

}31 }

在來看看第三種寫法:

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.threading.tasks;

namespace

單例模式

//////

靜態變數:會在型別第一次使用的時候初始化,而且只初始化一次

/// private

static singletonthird instance = new

singletonthird();

public

static

singletonthird createinstance()}}

設計模式 三 單例模式

package zzq.designpatterns.creativepattern import lombok.data 單例 singleton 模式的定義 指乙個類只有乙個例項,且該類能自行建立這個例項的一種模式。例如,windows 中只能開啟乙個任務管理器,這樣可以避免因開啟多個任務管理器...

設計模式三 單例設計模式

引言 單例設計模式是我們設計模式學習中很重要的乙個,在實際開發中用處也非常多,今天把單利設計模式詳細的總結一下,大家一起交流分享一下。定義 單例設計模式就是保證乙個類僅有乙個例項,並提供乙個訪問他的全域性訪問點。用處 有時候對於系統過來說乙個例項很重要,例如 乙個系統可以有多個列印任務,但是只能有乙...

設計模式 單例模式

單例模式 singleton pattern 是乙個比較簡單的模式,其定義如下 ensure a class has only one instance,and provide a golbal point of acess to it.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...