第二篇部落格,最近自己看了一下程式設計的23種模式,對其中的單例模式比較感興趣。想著自己以前程式裡面經常要讀取配置檔案,並且要全域性使用,單例模式在此大有用處,於是抽空寫了乙個,記錄一下學習的過程,哈哈。
原始碼放在我的個人github。
單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。許多時候整個系統只需要擁有乙個的全域性物件,這樣有利於我們協調系統整體的行為。比如在某個伺服器程式中,該伺服器的配置資訊存放在乙個檔案中,這些配置資料由乙個單例物件統一讀取,然後服務程序中的其他物件再通過這個單例物件獲取這些配置資訊。這種方式簡化了在複雜環境下的配置管理。
實現單例模式的思路是:乙個類能返回物件乙個引用(永遠是同乙個)和乙個獲得該例項的方法(必須是靜態方法,通常使用getinstance這個名稱);當我們呼叫這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就建立該類的例項並將例項的引用賦予該類保持的引用;同時我們還將該類的建構函式定義為私有方法,這樣其他處的**就無法通過呼叫該類的建構函式來例項化該類的物件,只有通過該類提供的靜態方法來得到該類的唯一例項。
單例模式在多執行緒的應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從而同時各自建立了乙個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。 解決這個問題的辦法是為指示類是否已經例項化的變數提供乙個互斥鎖(雖然這樣會降低效率)。
單例模式本身有很多可以琢磨的地方,感興趣的可以上csdn搜部落格,此處不詳細舉例。
single.h 標頭檔案
#ifndef single_h_
#define single_h_
#ifndef win32
#define configinfo_dllapi
#else
#ifdef configinfo_exports
#define configinfo_dllapi __declspec(dllexport)
#else
#define configinfo_dllapi __declspec(dllimport)
#endif
#endif
#include #include #include #include #include #include #include class configinfo_dllapi configinfo
configinfo(configinfo &&) = delete;
configinfo(const configinfo &) = delete;
configinfo &operator=(configinfo &&) = delete;
configinfo &operator=(const configinfo &) = delete;
static ptr config_info;
std::mapstorage;
public:
~configinfo() {}
public:
static ptr getinstance();
bool open(const char *config_file_path);
template t get(std::string key)
else
}};template <>
std::string configinfo::get(std::string key)
else
}#endif /* !single_h_ */
single.cpp 檔案
#include "single.h"
#include #include #include #include using namespace std;
configinfo::ptr configinfo::config_info(new configinfo());
/** * @brief 初始化函式
* @note
* @param *config_file_path: 配置檔案路徑
* @retval none
*/bool configinfo::open(const char *config_file_path)
while (!ifs_in.eof())
else if (line.substr(0, 1) == "#" || line.substr(0, 1) == "*")
stringstream sstr_line(line);
transform(key.begin(), key.end(), key.begin(), ::tolower);
sstr_line >> key;
sstr_line >> value;
storage[key] = value;
}return true;
}/**
* @brief 獲取單例模式下的唯一物件
* @note
* @retval
*/configinfo::ptr configinfo::getinstance()
測試** config.txt檔案是自己定義的鍵值對形式配置檔案,即
key1 value1
key2 value2
#include "single.h"
int main(int argc, char *ar**)
完成這樣乙個類,以後訪問配置資訊定義乙個指標就可以自由訪問了,一下子就方便了,不再為無法隨時隨地獲取配置資訊糾結,不過要記得使用前一定要open自己的配置檔案。 python利用模組實現單例模式
單例是最常使用的模式,通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於被外界訪問,從而方便對例項個數的控制並節約系統資源。python實現單例模式一般可以對建立例項的方法 new 進行改造 class singleton object instance none def new cls,a...
利用static來實現單例模式
class singleton private static singleton instance null publicsynchronizedstatic singleton getinstance return instance 就利用sington.getinstace就可以了,獲得的是同乙...
單例模式記錄
單例模式就是保證在整個應用程式的生命週期中,在任何時刻,被指定的類只有乙個例項,並為客戶程式提供乙個獲取該例項的全域性訪問點。一 經典模式 public class singleton public static singleton getinstance return instance 解析如下 ...