簡單的研究了一下單例模式

来源:http://www.cnblogs.com/myblogslh/archive/2016/03/25/5321570.html
-Advertisement-
Play Games

之前我喜歡只是單純的記記筆記,沒有什麼寫文章的習慣,今天也是我一邊研究一邊學習,索性就連過程什麼的都記錄下吧,或許能幫到一兩個朋友呢。 首先,我們來想想什麼叫做單例,顧名思義,單一的一個對象,那麼,單一模式有什麼好處呢?比如說,你的對象只可以實例化一次等等。 先寫一個簡單的測試里的例子吧,比如我建一 ...


  之前我喜歡只是單純的記記筆記,沒有什麼寫文章的習慣,今天也是我一邊研究一邊學習,索性就連過程什麼的都記錄下吧,或許能幫到一兩個朋友呢。

  首先,我們來想想什麼叫做單例,顧名思義,單一的一個對象,那麼,單一模式有什麼好處呢?比如說,你的對象只可以實例化一次等等。

  先寫一個簡單的測試里的例子吧,比如我建一個類,叫做TestSingle

  

1  /// <summary>
2     /// 單例模式簡單的例子(sealed,不可繼承)
3     /// </summary>
4     public sealed class TestSingle
5     {
6     }

  首先要讓這個類不可繼承,要不然就沒有意義了,那麼,接下來做什麼呢?讓一個對象只實例化一次,從而降低等等一些亂七八糟的東西。專業名詞很多,百度搜搜就可以看到了。我們在實例化一個對象會做什麼呢?肯定是new一個對象了,那麼new對象的時候會發生什麼事情呢?就是執行構造函數,那如何讓我們這個類只實例化一次呢?看樣子只能從構造函數入手了。

  

 1  /// <summary>
 2         /// 用來記錄構造函數執行的次數
 3         /// </summary>
 4         private static int structureCount = 0;
 5 
 6         /// <summary>
 7         /// 私有的無參構造函數
 8         /// </summary>
 9         private TestSingle() 
10         {
11             structureCount++;
12             Console.WriteLine("只是第{0}次執行構造函數", structureCount);
13         } 

  首先我定義了一個靜態的變數用來存儲構造函數執行的次數,併在構造函數中輸出執行的次數。當我把構造函數私有化之後,如何通過別的方式來讓外界訪問到呢?我們來寫一個public的方法,來提供外界的調用,當然,這個方法也是一個靜態的方法。

 1  /// <summary>
 2         /// 實例化時執行的此處
 3         /// </summary>
 4         private static int createStructureCount = 0;
 5 
 6         /// <summary>
 7         /// TestSingle
 8         /// </summary>
 9         private static TestSingle testSingle = null;
10 
11 
12   /// <summary>
13         /// 創建一個testSingle的實例
14         /// </summary>
15         /// <returns></returns>
16         public static TestSingle CreateTestSingle()
17         {
18             createStructureCount++;
19             Console.WriteLine("我是第{0}次創建TestSingle實例化", createStructureCount);
20             testSingle = new TestSingle();
21             return testSingle;
22         }

  這樣寫和一個普通的new又有什麼區別?我們來把方法改造一下

 1  /// <summary>
 2         /// 創建一個testSingle的實例
 3         /// </summary>
 4         /// <returns></returns>
 5         public static TestSingle CreateTestSingle()
 6         {
 7             createStructureCount++;
 8             Console.WriteLine("我是第{0}次創建TestSingle實例化", createStructureCount);
 9             if (testSingle == null)
10             {
11                 testSingle = new TestSingle();
12             }
13             return testSingle;
14         }

  我們去執行一下測試一下看效果如何。

  我們可以看到構造函數被執行了兩次,我電腦的CPU性能並不是很好,如果好一點的電腦可能會執行更多次。那麼我是怎麼進行測試的呢?我寫了一個線程工廠,不停的去CreateTestSingle

 1  static void Main(string[] args)
 2         {
 3             //創建一個Task工廠
 4             TaskFactory taskFactory = new TaskFactory();
 5             for (int i = 0; i < 20; i++)
 6             {
 7                 taskFactory.StartNew(() => TestSingle.CreateTestSingle());
 8             }
 9             Console.ReadLine();
10         }

  也就是說,在很多個線程同時去Create的時候,不妨還是new了多個對象。所以光這樣是不行的,所以我加了一個鎖和雙層判斷

  

 1   /// <summary>
 2         /// 鎖定對象
 3         /// </summary>
 4         private static object lock_SingleTest = new object();
 5 
 6   /// <summary>
 7         /// 創建一個testSingle的實例
 8         /// </summary>
 9         /// <returns></returns>
10         public static TestSingle CreateTestSingle()
11         {
12             if (testSingle == null)
13             {
14                 lock (lock_SingleTest)
15                 {
16                     if (testSingle == null)
17                     {
18                         testSingle = new TestSingle();
19                     }
20                    
21                 }
22             }
23             createStructureCount++;
24             Console.WriteLine("我是第{0}次創建TestSingle實例化", createStructureCount);
25             return testSingle;
26         }

  再次執行一次

  這樣的話,不管我執行多少次,構造函數都始終只會被執行一次。大家可以讓線程睡眠後再列印看看結果,那樣我想你就可以看的出來效果了。哦了,這樣我們就把單例模式創建完了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 51 Windows 無法找到網路路徑。請確認網路路徑正確並且目標電腦不忙或已關閉。如果 Windows 仍然無法找到網路路徑,請與網路管理員聯繫。 52 由於網路上有重名,沒有連接。請到“控制面板”中的“系統”更改電腦名,然後重試。 53 找不到網路路徑。 54 網路很忙。 55 指定的網路資 ...
  • ID 類型 來 源 代 表 的 意 義 舉 例 解 釋 ...
  • 一、進程/線程 進程:系統進行資源分配和調度的一個獨立單位。(存資源) 線程:CPU調度和分派的基本單位。(執行) 一個進程可以有多個線程,一個線程可與同屬一個進程的其他線程共用進程所擁有的全部資源。 場景:超市。 /// <summary> /// 單線程 /// </summary> /// < ...
  • 大家在用三層架構做開發的時候,是否有使用介面,使用介面的時候是否有類似這樣的代碼: 然後每個每個表都有一個這樣的介面代碼,對比之後發現,這樣的代碼是不是很多重覆呢?那麼有什麼好的辦法可以減少這樣的重覆代碼??? 我想到的是泛型,介面同樣可以泛型,看下麵這張圖,IT_admin,IT_advs,IT_ ...
  • 1.//彈出對話框.點擊轉向指定頁面 2.//彈出對話框 3.//刪除文件 4.//綁定下拉列表框datalist 5.//時間去秒顯示 6.//標題帶鏈接 7.//修改轉向 8.//彈出確定按鈕 9.//輸出數據格式化 "{0:F2}" 是格式 F2表示小數點後剩兩位 10.//提取動態網頁內容 ...
  • 請求如何進入ASP.NET MVC框架 thx@4littleProgrammer url:http://www.cnblogs.com/4littleProgrammer/p/5317058.html ...
  • 環境:VS2013+MVC5+IIS EXPRESS 問題:如果從Asp.net Web遷移到MVC,可能會遇到需要使原來的鏈接(如http://localhost:12345/old/library.html)可以繼續訪問的情況,而預設情況下,MVC對於html尾碼是不經過路由的,直接給你一個40 ...
  • 我在前面一篇隨筆《Socket開發框架之框架設計及分析》中,介紹了整個Socket開發框架的總體思路,對各個層次的基類進行了一些總結和抽象,已達到重用、簡化代碼的目的。本篇繼續分析其中重要的協議設計部分,對其中消息協議的設計,以及數據的拆包和封包進行了相關的介紹,使得我們在更高級別上更好利用Sock ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...