日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

11单件模式(Singleton Pattern)

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11单件模式(Singleton Pattern) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

創建型模式---單件模式(Singleton Pattern)
動機(Motivation):
??? 在軟件系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。
??? 如何繞過常規的構造器,提供一種機制來保證一個類只創建一個實例?
??? 這應該是類設計者的責任,而不是類使用者的責任。
結構圖:
????????
意圖:
??? 保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
??? ?? ?? ?? ?? ?? ?? ?? ? ? ?? ------<<設計模式>>GOF
生活的例子:
??????????
適用性:
?? (1)當類只能有一個實例而且客戶可以從一個眾所周知的訪問點訪問它時。
?? (2)當這個唯一實例應該是通過子類化可擴展的,并且客戶應該無需更改代碼就能使用一個擴展的實例時。

代碼實現:
(1)單線程Singleton實現
??

????class?SingleThread_Singleton
????{
????????private?static?SingleThread_Singleton?instance?=?null;
????????private??SingleThread_Singleton(){}
????????public?static?SingleThread_Singleton?Instance
????????{
????????????get
????????????{
????????????????if?(instance?==?null)
????????????????{
????????????????????instance?=?new?SingleThread_Singleton();
????????????????}
????????????????return?instance;
????????????}
????????}
????}


以上代碼在單線程情況下不會出現任何問題。但是在多線程的情況下卻不是安全的。
如兩個線程同時運行到?if?(instance?==?null)判斷是否被實例化,一個線程判斷為True后,在進行創建
?instance?=?new?SingleThread_Singleton();之前,另一個線程也判斷(instance?==?null),結果也為True.
這樣就就違背了Singleton模式的原則(保證一個類僅有一個實例)。
怎樣在多線程情況下實現Singleton?
(2)多線程Singleton實現:

?1????class?MultiThread_Singleton
?2?????{
?3???????private??static?volatile?MultiThread_Singleton?instance?=?null;
?4???????private?static?object?lockHelper?=?new?object();
?5???????private?MultiThread_Singleton()?{?}
?6???????public?static?MultiThread_Singleton?Instance
?7???????{
?8???????????get
?9???????????{
10???????????????if?(instance?==?null)
11???????????????{
12???????????????????lock?(lockHelper)
13???????????????????{
14???????????????????????if?(instance?==?null)
15???????????????????????{
16???????????????????????????instance?=?new?MultiThread_Singleton();
17???????????????????????}
18???????????????????}
19???????????????}
20???????????????return?instance;
21???????????}?????????
22???????}
23?????

此程序對多線程是安全的,使用了一個輔助對象lockHelper,保證只有一個線程創建實例(如果instance為空,保證只有一個線程instance?=?new?MultiThread_Singleton();創建唯一的一個實例)。(Double Check)
請注意一個關鍵字volatile,如果去掉這個關鍵字,還是有可能發生線程不是安全的。
volatile?保證嚴格意義的多線程編譯器在代碼編譯時對指令不進行微調。
(3)靜態Singleton實現


3?????????class?Static_Singleton
4?????????{
5???????????? public?static?readonly?Static_Singleton?instance?=?new?Static_Singleton();
6?????????????private?Static_Singleton()?{?}
7?????????}


以上代碼展開等同于

1?????class?Static_Singleton
2?????????{
3???????????? public?static?readonly?Static_Singleton?instance;
4?????????????static?Static_Singleton()
5?????????????{
6?????????????????instance?=?new?Static_Singleton();
7?????????????}
8?????????????private?Static_Singleton()?{?}
9?????????}

由此可以看出,完全符合Singleton的原則。
優點: 簡潔,易懂
缺點: 不可以實現帶參數實例的創建。
(注:以上代碼及信息借鑒于李建忠老師的MSDN和TerryLee的文章。)

總結

以上是生活随笔為你收集整理的11单件模式(Singleton Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。