C 設計模式(一) 單例模式

2021-08-16 23:49:35 字數 2592 閱讀 6593

單例模式:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。

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

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

如何解決:判斷系統是否已存在單例,如果有則返回,沒有則建立。

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

單例大約有兩種實現方法:懶漢與餓漢。

懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化,所以上邊的經典方法被歸為懶漢實現;

餓漢:餓了肯定要飢不擇食。所以在單例類定義的時候就進行例項化。

特點與選擇:

由於要進行執行緒同步,所以在訪問量比較大,或者可能訪問的執行緒比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。在訪問量較小時,採用懶漢實現。這是以時間換空間。

非執行緒安全的實現:

class singleton

; ~singleton() {};

singleton(const singleton&) = delete;

singleton& operator=(const singleton& that) = delete;

public:

static singleton* getinstance();

static

void release();

};singleton* singleton::getinstance()

return m_pins;

}void singleton::release()

}singleton* singleton::m_pins = nullptr;

int main()

考慮兩個執行緒同時首次呼叫instance方法且同時檢測到p是null值,則兩個執行緒會同時構造乙個例項給p,這是嚴重的錯誤。可以使用的所謂的「雙檢鎖模式」(double-checked locking pattern)。因為進行一次加鎖和解鎖是需要付出對應的代價的,而進行兩次判斷,就可以避免多次加鎖與解鎖操作,同時也保證了執行緒安全。可以使用c++11中的來實現lock()和unlock():

singleton* singleton::getinstance()

unlock();

}return m_pins;

}

class singleton

; ~singleton() {};

singleton(const singleton&) = delete;

singleton& operator=(const singleton& that) = delete;

public:

static singleton* getinstance();

static

void release();

};singleton* singleton::getinstance()

void singleton::release()

}singleton* singleton::m_pins = new singleton();

int main()

這種實現在編譯器初始化的時候就完成了例項的建立,由於例項化是在初始化階段執行的,所以沒有執行緒安全的問題,但是潛在問題在於no-localstatic物件(函式外的static物件)在不同編譯單元(可理解為cpp檔案和其包含的標頭檔案)中的初始化順序是未定義的。如果在初始化完成之前呼叫instance()方法會返回乙個未定義的例項。例如有兩個單例 singletona 和 singletonb ,都採用了 eager initialization ,那麼如果 singletona 的初始化需要 singletonb,而這兩個單例又在不同的編譯單元,初始化順序是不定的,如果 singletona 在 singletonb 之前初始化,就會出錯。

為了解決上面的問題,scott meyers在《effective c++》(item 04)中的提出另一種更優雅的單例模式實現,使用local static物件(函式內的static物件)。當第一次訪問 instance() 方法時才建立例項。

class singleton

; ~singleton() {};

singleton(const singleton&) = delete;

singleton& operator=(const singleton& that) = delete;

public:

static singleton* getinstance();

static

void release();

};singleton* singleton::getinstance()

void singleton::release()

}int main()

c++0x之後該實現是執行緒安全的。

C 設計模式 一 單例模式

c 單例模式也稱為單件模式 單子模式。使用單例模式,保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。有很多地方需要這樣的功能模組,如系統的日誌輸出等。單例模式有許多種實現方法,a.懶漢式 使用的時候才建立,多執行緒訪問的時候執行緒不安全 雙檢鎖 b.餓漢式 類檔案載...

C 設計模式(一) 單例模式

1,單利模式 保證乙個類只有乙個例項,並提供乙個訪問它的全域性訪問點,使得系統中只有唯一的乙個物件例項。應用 常用於管理資源,如日誌,執行緒池 實現要點 在類中,要構造乙個例項,就必須呼叫類的建構函式,並且為了保證全域性只有乙個例項。需防止在外部呼叫類的建構函式而構造例項,需要將建構函式的訪問許可權...

設計模式 C 設計模式 單例模式

設計模式 物件導向設計七大原則 設計模式 設計模式概念和分類 設計模式 c 設計模式 單例模式 設計模式 c 設計模式 工廠方法模式 設計模式 c 設計模式 抽象工廠模式 設計模式 c 設計模式 建造者模式 設計模式 c 設計模式 原型模式 作者自用的泛型單例模組 單例模式 singleton pa...