【學習筆記】單例類模板
一、單例類模板
以下為一個通用的單例模式框架,這種設計允許其他類通過繼承Singleton模板類來輕松實現單例模式,而無需為每個類重復編寫單例實現代碼。
// 命名空間(Namespace) 和 模板(Template)
// 命名空間用于將代碼組織成邏輯組,避免不同模塊間的命名沖突
// 泛型實現:T 可以是任意類型(如 int、std::string、自定義類)。編譯時實例化:編譯器會為每個使用的具體類型生成對應的代碼。namespace core {
template <typename T>class Singleton {// 獲取單例實例的靜態方法public:static T& Instance() {static T instance{Token{}};return instance;}// 防止單例對象被復制或賦值,確保全局唯一性。Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton) = delete;// Token 結構體:一個空的標記類型,用于讓派生類能夠調用基類的構造函數(因為構造函數是受保護的)。受保護的構造函數:防止外部直接實例化Singleton,但允許派生類繼承。protected:struct Token {};Singleton() = default;~Singleton() = default;
};
繼承單例類模板實例:
class IpSourceManage : public core::Singleton<IpSourceManage>
{
public:IpSourceManage(Token){};~IpSourceManage(){};..........};
二、單例類標志
靜態獲取方法(如 Instance())
單例類必須提供一個靜態方法來獲取唯一實例,通常命名為 Instance()。
static MyClass instance; // 靜態實例(餓漢式)static MyClass& Instance() {static MyClass instance; // 懶漢式(C++11后線程安全)return instance;
}
private 或 protected 構造函數
禁止外部直接實例化,只能通過 Instance() 方法創建對象。
class Nodes : public Node /*, public NodeMatch */ {public:private:Nodes();~Nodes();..........
禁用拷貝和賦值
delete 關鍵字:顯式刪除拷貝構造函數和賦值運算符,防止對象被復制。
MyClass(const MyClass&) = delete; // 禁用拷貝構造
MyClass& operator=(const MyClass&) = delete; // 禁用賦值