兩種設計模式(2)==>>"單例"

来源:http://www.cnblogs.com/zhangzongle/archive/2016/03/04/5243046.html
-Advertisement-
Play Games

所謂“單例”: 單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。 C#中的例子: 轉:htt


所謂“單例”:

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。

C#中的例子:

轉:http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html

  一、經典模式:

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()創建一個實例;否則,直接向客戶返回一個實例。

     4)測試

            Singleton p1 = Singleton.GetInstance();
            Singleton p2 = Singleton.GetInstance();
            if (p1 == p2)
            {
                //會顯示
                MessageBox.Show("地址相同!");
            }

  在這種經典模式下,沒有考慮線程併發獲取實例問題,即可能出現兩個線程同時獲取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
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分支結構 1.if後面可以不加{},但是不建議,容易產生誤解2.寫程式的時候先防屌絲測試,再寫邏輯,否則會出錯3.if:一條分支 if else:兩條分支 if...else if...:多條分支(結尾可以不加else)4.註意大括弧5.switch-case(與else if比較):(1).只能對
  • 前言:django1.8版本出現這種問題,關於標題不好命令,直接看正文問題描述! 問題描述: 在已經生成了models.py中表的情況下,更改了modes.py中的表,但是syncdb不起作用報錯。於是我用了個死方法,登錄MySQl手動把表刪了,也刪了應用中migrations文件夾,然後再進行 m
  • Java8讀文件僅需一行代碼 此方法確保了當讀入文件的所有位元組內容時,文件屬性是關閉的,否則就會出現IO異常或其它的未檢查異常。這意味著在讀文件到最後的塊內容後,無需關閉文件。要註意,此方法不適合讀取很大的文件,因為可能存在記憶體空間不足的問題。開發者還應該明確規定文件的字元編碼,以避免任異常或解析錯
  • 闡述C++中多任務處理的相關概念
  • public class HttpsTest { @SuppressWarnings("deprecation") public static void main(String[] args) { try { SSLContext context = SSLContext.getInstance("
  • php中讀取文件可以使用fopen和file_get_contents這兩個函數,二者之間沒有本質區別,只是前者讀取文件的php代碼相比後者要複雜一點。本文章通過實例向大家講解fopen和file_get_contents讀取文件的實現代碼。需要的碼農可以參考一下。 fopen讀取文件的代碼如下:
  • Java 異常處理方法 Java catch多個異常處理 Java Finally實例 Java 如何使用 catch 處理異常 Java 多線程異常處理實例 Java 如何獲取異常的堆棧信息 Java 重載方法異常處理 Java 鏈試異常實例 Java 如何自定義異常處理
  • 學習maven項目時 搭建個ssm項目 算是給自己留個備份吧 環境說明: MyEclipse10 Maven 3.2.3 框架: struts2 2.3.24.1 spring3 3.0.5.RELEASE mybatis 3.2.2 資料庫: mysql 5.7 <project xmlns="h
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...