c 設計模式之單例模式的實現方式

2022-09-26 02:42:08 字數 3045 閱讀 1586

場景描述

單例模式對於我們來說一點也不模式,是乙個常見的名稱,單例模式在程式中的實際效果就是:確保乙個程式中只有乙個例項,並提供乙個全域性訪問點,節省系統資源

單例模式無論是在實際開發中還是在軟體應用中比較常見,比如,windows系統的任務管理器、iis的httpapplication、實際專案中的日誌元件等等

實現方式

單例模式為了實現乙個例項,那麼只有不把例項建立暴露出去,只通過類本身來建立例項,為了實現效果,需要定義乙個私有建構函式

單例模式實現方式有:餓漢式、懶漢式、雙重驗證式、靜態內部類

下面分別對每一種實現方式做乙個簡單的例項,以及其優缺點

餓漢式///

/// 建立乙個 singleton 類(餓漢式)

/// 這種方式比較常用,但容易產生垃圾物件。

///優點:沒有加鎖,執行效率會提高。

///缺點:類載入時就初始化,浪費記憶體。

///它基於 classloder 機制避免了多執行緒的同步問題,不過,instance 在類裝載時就例項化,

///雖然導致類裝載的原因有很多種,在單例模式中大多數都是呼叫 getinstance 方法,

///但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,這時候初始化 instance 顯然沒有達到 lazy loading 的效果。

///

public class singleobject

//獲取唯一可用的物件

public static singleobject getinstance()

public void showmessage()

}懶漢式

///

/// 建立乙個 singleton 類(懶漢式)

/// 這種方式具備很好的 lazy loading,能夠在多執行緒中很好的工作,但是,效率很低,99% 情況下不需要同步。

/// 優點:第一次呼叫才初始化,避免記憶體浪費。

/// 缺點:懶漢式在單個執行緒中沒有問題,但多個執行緒同事訪問的時候就可能同事建立多個例項,而且這多個例項不是同乙個物件。

///

public class singleobject1

//獲取唯一可用的物件

public static singleobject1 getinstance()

return instance;

} public void showmessage()

}雙重驗證式

///

/// 建立乙個 singleton 類(雙重驗證)

/// 這種方式具備很好的 lazy loading,能夠在多執行緒中很好的工作,但是,效率很低,99% 情程式設計客棧況下不需要同步。

/// 優點:第一次呼叫才初始化,避免記憶體浪費,執行緒安全。

/// 缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。

///

public class singleobject2

//獲取唯一可用的物件

public static singleobject2 getinstance()}}

return instance;

} public void showmessage()

}靜態內部類

///

/// 建立乙個 singleton 類(靜態內部類)

/// 這種方式不用加鎖,在效率上和記憶體使用上都比較優秀

/// 克服了餓漢模式的不足餓漢模式執行效率高,由於在類載入的時候初始化導致記憶體浪費

///

public class singletonstatic

///

/// 例項化

///

internal static singletonstatic singletonstatic = new singletonstatic();

} ///

/// 私有建構函式

///

private singletonstatic()

///

/// 獲取例項

///

///

public static singletonstatic getinstance()

public void showmessage()

}每一種建立方式測試

建立乙個控制台程式,通過多執行緒對每一種實現方式使用,檢視其實例次數分析:

/*介紹意圖:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

主要解決:乙個全域性使用的類頻繁地建立與銷毀。

何時使用:當您想控制例項數目,節省系統資源的時候。

如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有程式設計客棧則建立。

關鍵**:建構函式是私有的。

應用例項:

典型的已有應用:

1、windows的任務管理器等

2、iis的httpapplication,所有的httpmodule都共享乙個httpapplication例項

在專案中的實際使用場景:

1、日誌元件

2、多執行緒執行緒池管理

3、**計數器

4、配置檔案管理

*/class program

));}

//// 測試--懶漢式

for (int i = 0; i < 5; i++)

));}

//// 測試--雙重驗證

for (int i = 0; i < 5; i++)

));}

////dqvyl 測試--靜態內部類

for (int i = 0; i < 5; i++)

));}

console.readline();

} }執行結果:

通過結果可以看出:懶漢式實際建立了2個例項,所以在多執行緒中,懶漢式有執行緒不安全問題

總結根據單例模式是每一種實現方式對比分析,在實際使用過程中:

如果是單執行緒應用環境,建議可以採用懶漢模

如果是多執行緒應用環境,建議採用靜態內部類方式

本文標題: c#設計模式之單例模式的實現方式

本文位址:

設計模式之單例模式 C 實現

單例模式是應用很廣泛的一種設計模式,當需要某個類在整個工程中只有乙個例項的時候,就需要用到單例模式了。實現思路也不難。首先,將建構函式設定為私有 private 許可權,這樣就不允許外部建立例項了。然後,內部建立乙個例項,再通過乙個介面的getinstance 將其設定為公開 public 許可權的...

設計模式 C 實現單例模式

class singleton singleton singleton sing null singleton singleton getinstance 單例模式的實現要點 1 首先要將類的建構函式 複製建構函式和過載的賦值操作符設定為私有方法private,這樣禁止使用者呼叫建構函式來建立物件,...

設計模式 單例模式 C 實現

定義 指乙個類只有乙個例項,且該類能自行建立這個例項的一種模式。特點 1.單例類只有乙個例項物件 2.該單例物件必須由單例類自行建立 3.單例類對外提供乙個訪問該單例類的全域性訪問點。結構 單例類的建構函式往往是私有的。第一種 懶漢式單例 這種模式特點是類載入時沒有生成單例,只有當第一次呼叫geti...