好的網(wǎng)站設(shè)計模板廣州seo網(wǎng)站開發(fā)
鏈接:C++ 設(shè)計模式
鏈接:C++ 設(shè)計模式 - 享元模式
單例模式(Singleton Pattern)是創(chuàng)建型設(shè)計模式,它確保一個類只有一個實例,并提供一個全局訪問點來訪問這個實例。單例模式在需要全局共享資源或控制實例數(shù)量的場景中非常有用,例如數(shù)據(jù)庫連接、日志記錄器等。
1.問題分析
在開發(fā)中,有些對象需要全局唯一的實例。例如:
- 配置管理器:應(yīng)用程序的配置通常需要全局唯一的實例,以確保配置的一致性。
- 日志記錄器:日志記錄器需要全局唯一的實例,以便集中管理日志輸出。
- 線程池:線程池需要全局唯一的實例,以便高效地管理線程資源。
- 數(shù)據(jù)庫連接池:數(shù)據(jù)庫連接池需要全局唯一的實例,以便復用數(shù)據(jù)庫連接,減少連接創(chuàng)建和銷毀的開銷。
如果這些對象被多次創(chuàng)建,會導致以下問題:
- 資源浪費:每次創(chuàng)建新實例都會消耗系統(tǒng)資源,導致資源浪費。
- 狀態(tài)不一致:多個實例之間的狀態(tài)可能不一致,導致程序行為不可預測。
- 管理復雜:多個實例的管理和維護變得復雜,增加了代碼的復雜性和維護成本。
為了避免上述問題,我們需要一種機制來確保某個類只有一個實例,并提供一個全局訪問點來訪問該實例。這就是單例模式的核心需求。
2.實現(xiàn)步驟
- 私有化構(gòu)造函數(shù):將類的構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)和賦值運算符設(shè)為私有,防止外部創(chuàng)建實例。
- 定義靜態(tài)成員變量:用于存儲單例對象的唯一實例。
- 提供公共靜態(tài)方法:提供全局訪問點來獲取單例對象的唯一實例。
3.代碼示例
3.1.簡單形式
class Singleton {public:// 刪除拷貝構(gòu)造函數(shù)和賦值運算符,防止復制單例對象Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 獲取單例實例的公共靜態(tài)方法static Singleton& getInstance() {// 使用局部靜態(tài)變量來實現(xiàn)線程安全的單例模式static Singleton instance;return instance;}// 示例方法,顯示單例實例的地址void showMessage() { std::cout << "Singleton instance address: " << this << std::endl; }private:// 私有構(gòu)造函數(shù),防止外部創(chuàng)建實例Singleton() { std::cout << "Singleton instance created." << std::endl; }// 私有析構(gòu)函數(shù),防止外部刪除實例~Singleton() { std::cout << "Singleton instance destroyed." << std::endl; }
};
int main() {// 獲取單例實例并調(diào)用方法Singleton& singleton = Singleton::getInstance();singleton.showMessage();// 嘗試獲取另一個單例實例Singleton& anotherSingleton = Singleton::getInstance();anotherSingleton.showMessage();return 0;
}
3.2.指針形式
#include <memory>
#include <mutex>
#include <stdexcept>class Singleton {public:// 刪除拷貝構(gòu)造函數(shù)和賦值運算符,防止復制實例Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 獲取實例的靜態(tài)方法static Singleton& getInstance() {if (!instance) {throw std::logic_error("Instance not yet initialized. Call initInstance() first.");}return *instance;}// 初始化實例的靜態(tài)方法static void initInstance(int value) {std::call_once(initFlag, [&]() { instance.reset(new Singleton(value)); });}// 示例方法void showMessage() { std::cout << "Singleton instance address: " << this << std::endl; }private:// 私有化構(gòu)造函數(shù),防止外部創(chuàng)建實例Singleton(int value) : value_(value) { std::cout << "Singleton instance created with value: " << value_ << std::endl; }// 私有化析構(gòu)函數(shù),防止外部刪除實例~Singleton() { std::cout << "Singleton instance destroyed." << std::endl; }// 靜態(tài)智能指針成員變量,用于保存唯一的實例static std::unique_ptr<Singleton> instance;// 用于確保單例初始化的標志static std::once_flag initFlag;// 示例成員變量int value_;
};// 初始化靜態(tài)成員變量
std::unique_ptr<Singleton> Singleton::instance = nullptr;
std::once_flag Singleton::initFlag;
int main() {// 初始化單例實例Singleton::initInstance(42);// 獲取單例實例并調(diào)用方法Singleton& singleton = Singleton::getInstance();singleton.showMessage();// 再次獲取單例實例并調(diào)用方法Singleton& singleton2 = Singleton::getInstance();singleton2.showMessage();return 0;
}