(一)單例模式簡介:
單例模式(數學與邏輯學中,singleton定義為"有且僅有乙個元素的集合"),是一種常用的軟體設計模式。在它的核心結構中只包含乙個被稱為單例的特殊類。通過單例模式可以保證系統中,保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
(二)為什麼要用單例模式呢?
在我們的系統中,有一些物件其實我們只需要乙個,比如說:執行緒池、快取、對話方塊、登錄檔、日誌物件、充當印表機、顯示卡等裝置驅動程式的物件。事實上,這一類物件只能有乙個例項,如果製造出多個例項就可能會導致一些問題的產生,比如:程式的行為異常、資源使用過量、或者不一致性的結果。
(三)簡單來說使用單例模式可以帶來下面幾個好處:
為什麼不使用全域性變數確保乙個類只有乙個例項呢?
我們知道全域性變數分為靜態變數和例項變數,靜態變數也可以保證該類的例項只存在乙個。 只要程式載入了類的位元組碼,不用建立任何例項物件,靜態變數就會被分配空間,靜態變數就可以被使用了。
但是,如果說這個物件非常消耗資源,而且程式某次的執行中一直沒用,這樣就造成了資源的浪費。利用單例模式的話,我們就可以實現在需要使用時才建立物件,這樣就避免了不必要的資源浪費。不僅僅是因為這個原因,在程式中我們要盡量避免全域性變數的使用,大量使用全域性變數給程式的除錯、維護等帶來困難。
要點:單例類只能有乙個例項;
單例類必須自行(自己給自己)建立這個例項;
單例類必須向整個系統提供這個物件的例項。
從具體實現角度來說,三個步驟:
①通過new乙個靜態私有變數
private static singleton instanc=new singleton( );
②構造方法私有化
private singleton()
③新建乙個靜態的公共的函式用於建立或獲取它本身的靜態私有物件的方法(靜態,不能依賴物件呼叫,不能返回類型別)
public static singleton getintance()
一共有七中單例模式:
①餓漢式(浪費資源)
②飽漢式(資料不安全)-----解決辦法:方法中加鎖
③加同步鎖
④加雙重鎖
⑤餓漢式(餓漢式的變種,由餓漢式改變而來)
將靜態變數放在了乙個靜態內部類中(達到延時效果)
返回 類名.變數名
(1)懶漢方式又稱為延時載入,用的時候才生成。(考慮執行緒安全)
/*將方法設為同步*/
calss signalton
return instance;
}private:
signalton(){}
signalton(const signalton&);
singleton& operator=(const singleton&);
static signalton*instance;
}signalton* signalton::instance = null;
/*雙鎖機制:避免在已經存在例項時每次都進行鎖操作,提高效能*/
calss signalton
//unlock();
}return instance;
}private:
signalton(){}
signalton(const signalton&);
singleton& operator=(const singleton&);
static signalton*instance;
}signalton* signalton::instance = null;
/*靜態內部類,這種比上面1、2都好一些,既實現了執行緒安全,又避免了同步帶來的效能影響。*/
calss signalton
private:
signalton(){}
signalton(const signalton&);
singleton& operator=(const singleton&);
}signalton* signalton::instance = null;
(2)餓漢方式又稱為貪婪載入 ,一開始就生成,及時不用的時候也生成。
calss signalton
private:
signalton(){}
signalton(const signalton&);
singleton& operator=(const singleton&);
static signalton*instance;
}signalton* signalton::instance = new signalton();
C 單例模式
include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...
C 單例模式
實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...
C 單例模式
效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...