單例模式也是建立型模式的一種,也是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 }
usingsystem;
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.確保某乙個類只有乙個例項,而且自行例項化並且向整個系統提供這個...