殼的搭建中,在給標題綁定數據時,的代碼如下
Title="{BindingPath=SystemTitle,Source={x:StaticMApp:MApp.Instance}}"
我們用到了一個單例,那麼下面來說說單例以及它在整個插件式架構和開發中的作用。
插件式架構中,我們經常會需要一個系統生命週期中的唯一實體來存儲一些數據信息,並且這些數據信息能很好的被各個插件使用,這時候我們自然而然的就會想到單例模式,那麼究竟什麼是單例模式呢?
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱爲單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易於外界訪問,從而方便對實例個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
單例模式的要點有三個;一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。
從具體實現角度來說,就是以下三點:一是單例模式的類只提供私有的構造函數,二是類定義中含有一個該類的靜態私有對象,三是該類提供了一個靜態的公有的函數用於創建或獲取它本身的靜態私有對象。
下面我們就來創建一個單例例子,代碼如下:
/// <summary>
///單例實體
/// </summary>
public class Mdemo
{
/// <summary>
///定義一個私有的靜態全局變量來保存該類的唯一實例
/// </summary>
private static MDemo singleton;
/// <summary>
///定義一個只讀靜態對象
///且這個對象是在程序運行時創建的
/// </summary>
private static readonly objectsyncObject = new object();
/// <summary>
///構造函數必須是私有的
///這樣在外部便無法使用 new來創建該類的實例
/// </summary>
private MDemo()
{
}
/// <summary>
///定義一個全局訪問點
///設置爲靜態方法
///則在類的外部便無需實例化就可以調用該方法
/// </summary>
public static MDemo Instance
{
//這裏可以保證只實例化一次
//即在第一次調用時實例化
//以後調用便不會再實例化
//第一重singleton == null
get
{
if (singleton == null)
{
lock (syncObject)
{
//第二重 singleton == null
if (singleton == null)
{
singleton = newMDemo();
}
}
}
return singleton;
}
}
從上面的代碼中我們看到,定義了一個私有的靜態全局變量singleton來保存該類的唯一實例。
該單例類的構造函數必須是私有的,這樣在外部便無法使用 new 來創建該類的實例。
那麼,我們如何來初始化和使用單例呢?一般單例的初始化放在單例引用的方法或屬性中,我們這裏爲了實現數據界面綁定,我們採用提供屬性的方式來供外部使用,並在屬性中初始化單例。
在初始化前兩次判斷單例實體singleton是否爲空,第一次是爲了在使用單例實體時,判斷單例是否已經初始化。第二次是爲了在初始化單例時,將初始化單例放到對象鎖中後,再一次判斷但是是否已經被初始化,因爲有可能在加鎖後單例已經被別的程序初始化了,如果不進行二次判斷的話,再次初始化,那麼單例存儲的數據信息將會被覆蓋。
基本的單例我們已經建立完成,我們只要將需要存儲的數據信息作爲屬性放到單例中,給予賦值即可存儲數據信息。
由於單例在第一次調用時就會創建,創建的實例將會在應用程序的整個生命週期中存在,也就是說單例會一直佔用着相應的資源,所以在使用單例的過程中也要考慮清楚,是否需要使用,需要慎用。