Singleton 單件

模式分類

從目的來看:

-創建型(Creational)模式:負責對象創建

-結構型(Structural)模式:處理類與對象間的組合

-行為型(Behavioral)模式:類與對象交互中的職責分配

從范圍來看:

-類模式處理類與子類的靜態關系

-對象模式處理對象間的動態關系

?

動機(Motivation)

在軟件系統中,經常有這樣一些特殊的類,必須保證它們在系統中只存在一個實例,才能確保它們的邏輯正確性、以及良好的效率。

如何繞過常規的構造器,提供一種機制來保證一個類只有一個實例?

這應該是類設計者的責任,而不是使用者的責任

?

意圖(Intent)

保證一個類僅有一個實例,并提供一個該實例的全局訪問點

——《設計模式GoF》

?

結構(Structure)

image

?

單線程Singleton模式實現

image

?

私有的實例構造器是為了屏蔽默認產生的構造器,讓類的使用者無法調用構造器。

?

單線程Singleton模式的幾個要點

Singleton模式中的實例構造器可以設置為protected以允許子類派生。

Singleton模式一般不要支持ICloneable接口,因為這可能會導致多個對象實例,與Singleton模式的初衷違背。

Singleton模式一般不要支持序列化,因為這也有可能導致多個對象實例,同樣與Singleton模式的初衷違背。

Singleton模式只考慮到了對象創建的管理,沒有考慮對象銷毀的管理。就支持垃圾回收平臺和對象的開銷來講,我們一般沒有必要對其銷毀進行特殊的管理。

不能應對多線程環境:在多線程環境下,使用Singleton模式仍然有可能得到Singleton類的多個實例對象。

?

多線程Singleton模式實現

image

volatile修飾:編譯器在編譯代碼的時候會對代碼的順序進行微調,用volatile修飾保證了嚴格意義的順序。一個定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使用保存在寄存器里的備份。

?

使用.NET類型初始化機制實現多線程Singleton模式

image

以上是內聯初始化(生成的同時進行初始化)的單例模式,它等同于:

image

內聯初始化其實是把靜態的字段放到靜態構造器去初始化。反編譯出內聯初始化的代碼可以看出以上結論

image

只要想訪問靜態字段,必定已經在之前執行了靜態構造器。這樣也能夠精確地保證使用的時候一定能拿到實例,如果不使用也不會實例化對象,也就是延時加載的功能。他同樣能夠支持多線程環境,因為只可能有一個線程執行靜態構造器,不可能有多個線程去執行靜態構造器,感覺就是程序已經自動為我們加鎖了。

它的一點弊端就是它不支持參數化的實例化方法。在.NET里靜態構造器只能聲明一個,而且必須是無參數的,私有的。因此這種方式只適用于無參數的構造器。

?

Singleton模式擴展

將一個實例擴展到n個實例,例如對象池的實現。(n不是指無限個實例,而是固定的某個數)

將new構造器的調用轉移到其他類中,例如多個類協同工作環境中,某個局部環境只需要擁有某個類的一個實例。

理解和擴展Singleton模式的核心是“如何控制用戶使用new對一個類的實例構造器的任意調用”。

?

.NET框架中的Singleton應用

image

t1==t2 這說明,GetType方法獲得的Type實例都是單例。

HttpContext.Current也是如此,他們是通過Singleton的擴展方式實現的,他們的單例也并不是覆蓋所有領域,只是針對某些局部領域中,是單例的,不同的領域中還是會有不同的實例。

轉載于:https://www.cnblogs.com/ajunForNet/p/3748168.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375853.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375853.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

引入struts html標簽,【學習】Struts標簽之html標簽

html:multiboxhtml:multibox標簽生成多個checkbox。當您要使用大量的checkbox時使用這個標簽非常方便,可以使您避免在ActionForm中聲明大量的boolean類型的變量,帶之以一個數組就行了。注意:為了正確的處理沒有選中的checkbox您必須在reset()中設置數組的…

10個利用Eclipse調試Java的常見技巧

http://www.open-open.com/news/view/1ad9099 閱讀目錄 1. Conditional Breakpoint2. Exception Breakpoint3. Watch Point4. Evaluation (Display or Inspect or Watch)5. Change Variable Values6. Stop in Main7. Environment Variables8. Drop to Frame9. Step Filter10. S…

操作系統上機作業--創建N個線程(多線程)

ring.c: 創建N個線程,它們構成一個環 ? 創建N個線程:T1、T2、T3、… TN ? T1向T2發送整數1 ? T2收到后將整數加1 ? T2向T3發送整數2 ? T3收到后將整數加1 ? T3向T4發送整數3 ? … ? TN收到后將整數加1 ? TN向T1發送整數N 實…

管理者不應該做的事

1.責備讓每個人明白出錯的時候要承擔責任,而不是責任他,出問題要幫他認識問題,并且給他提供解決辦法,先了解來龍去脈,看看是哪里出了問題,是否能避免 2.印象沒有人會因為你的服裝、你的車、你的財產、你的頭…

臺式計算機網線,臺式電腦如何連接寬帶_臺式電腦如何連接網線

2017-03-11 21:36:28電腦直接撥號上網(有寬帶賬號和密碼)或者自動獲取IP(有帳號沒密碼)上方式設置見圖2016-12-10 13:29:30右擊網上鄰居,點屬性,創建一個新的連接,按照下一步下一步的步驟就可以了,然后成功之后輸入你的寬帶號碼和…

棧的應用--漢諾塔

#include<stdio.h>void move(char x,int n,char y){printf("%d號盤 %c柱 ---> %c柱\n",n,x,y); }void hanoi(int n,char x,char y,char z){if(n1){move(x,1,z);}else{hanoi(n-1,x,z,y);move(x,n,z);hanoi(n-1,y,x,z);} }int main(){int n;char xX;char yY;c…

Linux split命令實例

曾經是否想要把一個大文件分割成多個小文件&#xff1f;比如一個5gb日志文件&#xff0c;我們需要把它分成多個小文件&#xff0c;這樣我們才有可能使用普通的文本編輯器讀取它。有時我們需要傳輸20gb的大文件到另一臺服務器&#xff0c;這就需要我們把它分割成多個文件&#x…

PIC18F452之1602自定義字符

源&#xff1a;PIC18F452之1602自定義字符轉載于:https://www.cnblogs.com/LittleTiger/p/4595823.html

美國計算機工程專業,美國計算機工程專業哪些學校比較好

這里有一份相對比較專業點的排名表。希望能給你當一個參考。個人建議,選擇學校還是要根據自己的實際需要,以及個人情況來決定。不一定,排名最高的學校就是好的。要多多考慮一下自己的情況。如果真的需要推薦,建議樓主寫出自己的情況,以及內心的想法,當然還要包括財力。2008美國…

NewCode----求數列的和

題目描述 數列的第一項為n&#xff0c;以后各項為前一項的平方根&#xff0c;求數列的前m項的和。 輸入描述: 輸入數據有多組&#xff0c;每組占一行&#xff0c;由兩個整數n&#xff08;n < 10000&#xff09;和m(m < 1000)組成&#xff0c;n和m的含義如前所述。 輸…

Hadoop源碼分析7: IPC流程(1) 主要類

1.服務器端主要類 public abstractclass Server { public static final ByteBuffer HEADER ByteBuffer.wrap("hrpc".getBytes()); public static final byte CURRENT_VERSION 4; private static finalThreadLocal&#xff1c;Server&#xff1e; SERVER new ThreadLo…

html5 服務器手機編程,html5實現服務器發送事件

頁面DocumentStatus:Server Datajs代碼創建一個新的 EventSource 對象&#xff0c;然后規定發送更新的頁面的 URL(本例中是 "demo_sse.php")每接收到一次更新&#xff0c;就會發生 onmessage 事件當 onmessage 事件發生時&#xff0c;把已接收的數據推入 id 為 "…

【動態規劃】【多重背包】[HDU 1291]悼念512汶川大地震遇難同胞――珍惜現在,感恩生活...

這道題目是一個多重背包的題目&#xff0c;多重背包實際上就是把整個物品的件數拆分成a0?20a1?21a2?22...an?2n且a0或1這樣每一次最優解實際上就是在之前的基礎上進行的最優解的累加&#xff0c;但是發現如果物品數量不是恰好是某幾個數之和&#xff0c;那么就會出現有幾個…

輸出字符串的比特串

48是0的ASCII碼&#xff0c;49是1的ASCII碼&#xff0c;char型占一個字節&#xff0c;四個比特。 #include<iostream> #include<string.h> using namespace std; string Str2Bin (char* str){int change,k0,mask8;char bit;char stack[100]{0};for (short i 0; i…

法律專業計算機基礎試卷答案,大學計算機基礎試題及答案

以下是小編整理的關于大學計算機基礎試題及答案&#xff0c;希望對你有幫助。一、單選題1、完整的計算機系統由(C)組成。A、運算器、控制器、存儲器、輸入設備和輸出設備B、主機和外部設備C、硬件系統和軟件系統D、主機箱、顯示器、鍵盤、鼠標、打印機2、以下軟件中&#xff0c…

憑據不工作

最悲催的事情是什么&#xff1f;那就是你可以遠程別人的電腦&#xff0c;但是別人不能遠程自己的電腦&#xff01; 背景&#xff1a; 換了個win8.1的系統&#xff0c;剛開始可以遠程上,過了幾天,電腦突然不能遠程了,讓我很是郁悶呀. 于是在網上查了好多資料,看看他到底是什么原…

【最后的沖刺】android中excel表的導入和數據處理

【最后的沖刺】android中excel表的導入和數據處理 ——學校課程的查詢和修改 1.編寫 The Class類把課程表courses.db當做一個實體類&#xff0c;hashcode和equals這兩個類是為了判斷輸入的查詢內容和Excel表中的內容是否一致。 并在java里面區別兩個對象是否一致 1 public clas…

詳解C++函數模板

函數模板屬于類屬&#xff0c;能夠處理不同的數據類型&#xff0c;當編譯器遇到函數調用是&#xff0c;將根據實際參數的類型產生特定的代碼&#xff0c;函數模板的定義形式是&#xff1a; template <類型參數表> 返回值類型 函數名&#xff08;形式參數表&#xff09;{…

計算機專業女兵,陳豪2010《點解阿Sir》劇照

0陳豪2010《點解阿Sir》劇照2012-07-21 08:24{"info": {"setname": "陳豪2010《點解阿Sir》劇照","imgsum_bk": 20,"imgsum": 20,"lmodify": "2012-07-21 08:24:00","prevue": " "…

ASP.NET MVC學習之Ajax(完結)

一.前言 通過上面的一番學習&#xff0c;大家一定收獲不少。但是總歸會有一個結束的時候&#xff0c;但是這個結束也意味著新的開始。 如果你是從事ASP.NET開發&#xff0c;并且也使用了第三方控件&#xff0c;那么一定會覺得ASP.NET開發ajax十分的簡單&#xff0c;而ASP.NET M…