單例模式:保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。
主要解決:乙個全域性使用的類頻繁地建立與銷毀。
何時使用:想控制例項數目,節省系統資源的時候。
如何解決:判斷系統是否已存在單例,如果有則返回,沒有則建立。
關鍵**:建構函式是私有的。
單例大約有兩種實現方法:懶漢與餓漢。
懶漢:故名思義,不到萬不得已就不會去例項化類,也就是說在第一次用到類例項的時候才會去例項化,所以上邊的經典方法被歸為懶漢實現;
餓漢:餓了肯定要飢不擇食。所以在單例類定義的時候就進行例項化。
特點與選擇:
由於要進行執行緒同步,所以在訪問量比較大,或者可能訪問的執行緒比較多時,採用餓漢實現,可以實現更好的效能。這是以空間換時間。在訪問量較小時,採用懶漢實現。這是以時間換空間。
非執行緒安全的實現:
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...