C#設計模式學習筆記-單例模式

C#設計模式學習筆記-單例模式

?

  最近在學設計模式,學到創建型模式的時候,碰到單例模式(或叫單件模式),現在整理一下筆記。

  在《Design Patterns:Elements of Resuable Object-Oriented Software》中的定義是:Ensure?a class only has one instance,and provide a global point of access to。它的主要特點不是根據客戶程序調用生成一個新的實例,而是控制某個類型的實例數量-唯一一個。(《設計模式-基于C#的工程化實現及擴展》,王翔)。也就是說,單例模式就是保證在整個應用程序的生命周期中,在任何時刻,被指定的類只有一個實例,并為客戶程序提供一個獲取該實例的全局訪問點。

  一、經典模式:

復制代碼
public class Singleton
{
private static Singleton instance;

private Singleton()
{

}

public static Singleton GetInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
復制代碼

  解析如下:

  1)首先,該Singleton的構造函數必須是私有的,以保證客戶程序不會通過new()操作產生一個實例,達到實現單例的目的;

  2)因為靜態變量的生命周期跟整個應用程序的生命周期是一樣的,所以可以定義一個私有的靜態全局變量instance來保存該類的唯一實例;

  3)必須提供一個全局函數訪問獲得該實例,并且在該函數提供控制實例數量的功能,即通過if語句判斷instance是否已被實例化,如果沒有則可以同new()創建一個實例;否則,直接向客戶返回一個實例。

  在這種經典模式下,沒有考慮線程并發獲取實例問題,即可能出現兩個線程同時獲取instance實例,且此時其為null時,就會出現兩個線程分別創建了instance,違反了單例規則。因此,需對上面代碼修改。

  二、多線程下的單例模式

  1、Lazy模式

復制代碼
public class Singleton
{
private static Singleton instance;
private static object _lock=new object();

private Singleton()
{

}

public static Singleton GetInstance()
{
if(instance==null)
{
lock(_lock)
{
if(instance==null)
{
instance=new Singleton();
}
}
}
return instance;
}
}
復制代碼

  上述代碼使用了雙重鎖方式較好地解決了多線程下的單例模式實現。先看內層的if語句塊,使用這個語句塊時,先進行加鎖操作,保證只有一個線程可以訪問該語句塊,進而保證只創建了一個實例。再看外層的if語句塊,這使得每個線程欲獲取實例時不必每次都得加鎖,因為只有實例為空時(即需要創建一個實例),才需加鎖創建,若果已存在一個實例,就直接返回該實例,節省了性能開銷。

  2、餓漢模式

  這種模式的特點是自己主動實例。

復制代碼
public sealed class Singleton
{
private static readonly Singleton instance=new Singleton();

private Singleton()
{
}

public static Singleton GetInstance()
{
return instance;
}
}
復制代碼
  上面使用的readonly關鍵可以跟static一起使用,用于指定該常量是類別級的,它的初始化交由靜態構造函數實現,并可以在運行時編譯。在這種模式下,無需自己解決線程安全性問題,CLR會給我們解決。由此可以看到這個類被加載時,會自動實例化這個類,而不用在第一次調用GetInstance()后才實例化出唯一的單例對象。
http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html

轉載于:https://www.cnblogs.com/chengjun/p/4955867.html

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

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

相關文章

kotlin為什么比java編譯慢_為什么Kotlin編譯速度比Scala快? [關閉]

雖然我認為這個問題不適合Stack Overflow,因為它傾向于主要產生基于意見的答案,但這里有一個嘗試:你有兩種不同的語言,特別是關于類型系統,以及兩個完全獨立的編譯器實現 . 所以期望它們具有“相同”的編譯速度已經是一…

錫山國土推行數據中心“在線變更”

為全面提高全區土地變更工作效率,國土錫山分局全面推行數據中心在線變更。由不動產登記科利用數據中心管理平臺,將遙感影像、監測信息以及監測圖斑的土地利用現狀信息、土地利用總體規劃信息錄入“數據中心”,制定我區的變更調查工作方案&…

Linux 安裝loadrunner 碰到的問題

關于linux下面搭建loadrunner的詳細步驟: http://blog.sina.com.cn/s/blog_9aa583cf0101bu4y.html http://hi.baidu.com/higkoo/item/d75027acc78bab3e030a4dde?qq-pf-topcqq.c2c http://www.cnblogs.com/xiaoTT/archive/2012/02/15/2352127.html 用控制臺加載負載…

數據分析真的能驅動用戶快速增長嗎?

俗話說,“酒香不怕巷子深”;俗話又說,“酒香也怕巷子深” 。再后來,俗話還說,管他酒香不香巷子深不深,只要找個算盤技巧神乎其神的賬房先生,即數據科學家,酒就可以大賣了。這叫做用數據驅動用戶…

java 常見bug_java常見bug

org.hibernate.QueryException: could not resolve property: menuId of:無法解析menuId 字段,是指這個字段有錯Servlet.service() for servlet default threw exception09:28:54,704 ERROR [CoyoteAdapter] An exception or error occurred in the container durin…

解決啟動Biee控制臺亂碼問題

解決啟動Biee控制臺亂碼問題 在安裝完Biee后,大家都可以看到在程序中可以找到啟動BI服務的地方 點擊上圖中的啟動bi服務則在window系統中會彈出一個dos窗口,來顯示執行啟動服務的操作,如下圖 上圖顯示的是正常情況,本人安裝后首次…

“北航Clubs” Alpha版發布!

一、功能 1.獲取活動信息: 用戶進入網站后,第一眼就可以查看到近期活動 2.查看活動詳情 點擊活動標題,可以進入活動詳情頁面 3.注冊功能 首頁點擊注冊,輸入學號、密碼、姓名、手機號即可完成注冊 4.用戶登陸 擁有賬號之后&#xf…

物聯網與零邊際成本共享經濟

物聯網是由通訊網絡、能源網絡、物流網絡組成,這些網絡共同在單一操作系統中合作,持續尋找各種方法來提升資源整編、生產及配送商品和服務,以及廢棄物回收等過程中的熱力效率和生產力;這三種網絡相輔相成,缺一不可。若缺乏通訊&am…

C++程序設計教程學習(1)-第一部分 編程基礎

第一章 概述 C到底難不難學?沒有學不會的事情 1.1 程序設計語言 語言 編程語言 人和計算機交流的工具,群體擴大,人人間交流過程描述與信息表達的工具 機器語言,匯編語言,高級語言 1.2 C簡史 1.3 C 褒貶C 計算機應用范圍…

《Programming WPF》翻譯 第9章 6.我們進行到哪里了?

《Programming WPF》翻譯 第9章 6.我們進行到哪里了? 原文:《Programming WPF》翻譯 第9章 6.我們進行到哪里了?只有當任何內嵌控件都沒有提供你需要的底層行為時,你將要寫一個自定義控件。當你寫一個自定義控件,你將要使用到依賴…

php實現上傳,PHP實現文件上傳例子

實例1:上載文件表單網頁:updatefile.htm上載文件表單請選取文件:[CtrlA 全部選擇 然后拷貝]處理上載文件網頁:updatefile.php3處理上載文件copy($userfile, "newfilename");echo $userfile." - 用戶上傳到服務器上的文件臨時存…

浙企加入中國大數據產業生態聯盟 共商數據價值

基于大數據時代的考量,在工業和信息化部指導下,8月2日,中國電子信息產業發展研究院聯合大數據產業鏈各環節企業及第三方產業機構自愿組成非營利社會組織——中國大數據產業生態聯盟。浙江企業元寶鋪受邀成為聯盟理事成員單位。 大會現場&…

hdu 4442 Physical Examination (2012年金華賽區現場賽A題)

昨天模擬賽的時候坑了好久,剛開始感覺是dp,仔細一看數據范圍太大。 題目大意:一個人要參加考試,一共有n個科目,每個科目都有一個相應的隊列,完成這門科目的總時間為ab*(前面已完成科目所花的總時…

xsd學習教程

http://www.w3school.com.cn/schema/轉載于:https://www.cnblogs.com/eric-lin/p/4969269.html

php 賦值 遞增,PHP 基礎(賦值及函數)

開端<?php>結尾弱類型語言 定義變量的時候 不需要 聲明 但是 每一個變量前 都必須 加$ 符號儲存文件按 統一放到 安裝文件夾下面的 WAMP 下面 的WWW 文件內部 (與創的站點統一即可) 該文件下面不能出現中文注釋語法&#xff1a; 單行注釋&#xff1a;…

maven project創建填充項

GroupID是項目組織唯一的標識符&#xff0c;實際對應JAVA的包的結構&#xff0c;是main目錄里java的目錄結構。ArtifactID就是項目的唯一的標識符&#xff0c;實際對應項目的名稱&#xff0c;就是項目根目錄的名稱。一般GroupID就是填com.leafive.test這樣子。轉載于:https://w…

【循序漸進學Python】14.數據庫的支持

純文本只能夠實現一些簡單有限的功能。如果想要實現自動序列化&#xff0c;也可以使用 shelve 模塊和 pickle 模塊來實現。但是&#xff0c;如果想要自動的實現數據并發訪問&#xff0c;以及更標準&#xff0c;更通用的數據庫(database)存儲方式還是使用數據庫。 1. Python 數據…

Foundation框架

1.框架是由許多類、方法、函數、文檔按照一定的邏輯組織起來的集合&#xff0c;以便使研發程序變的更容易 清除緩存&#xff0c;刪除這個文件夾下的所有文件/Users/fanyafang/Library/Developer/Xcode/DerivedData 顯示隱藏文件&#xff1a;defaults write com.apple.finder Ap…

ubuntu上搭建php,ubuntu10.04上搭建php網站運行環境

ubuntu 10.04下搭建php網站運行環境ubuntu 10.04下搭建php網站運行環境前提&#xff1a;要打開root權限sudo password [這里填寫root密碼]1、第一步安裝ubuntu10.042、更新源sudo apt-get update3、安裝lighttpdsudo apt-get install lighttpd安裝好之后檢查lighttpd是否成功啟…