場景描述
單例模式對於我們來說一點也不模式,是乙個常見的名稱,單例模式在程式中的實際效果就是:確保乙個程式中只有乙個例項,並提供乙個全域性訪問點,節省系統資源
單例模式無論是在實際開發中還是在軟體應用中比較常見,比如,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...