確保系統中最多僅存在一個實例,由類別自行創建、持有、管理實例,控制實例數量。
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
#include <memory>
#include <boost/thread/mutex.hpp>
class Singleton {
public:
static Singleton& GetInstance();
private:
Singleton(); ~Singleton();
static std::auto_ptr<Singleton> s_instance;
friend class std::auto_ptr<Singleton>;
Singleton(const Singleton&); Singleton& operator=(const Singleton&);
};
#endif
#include "Singleton.h"
#include <boost/thread/mutex.hpp>
#include <iostream>
using namespace std; using namespace boost;
auto_ptr<Singleton> Singleton::s_instance;
Singleton::Singleton() { cout << "Construct Singleton" << endl; }
Singleton::~Singleton() { cout << "Destruct Singleton" << endl; }
Singleton& Singleton::GetInstance() {
static mutex s_mutex;
if (s_instance.get() == NULL) {
mutex::scoped_lock lock(s_mutex);
if (s_instance.get() == NULL) {
s_instance.reset(new Singleton());
}
}
return *s_instance;
}
auto_ptr 確保線程安全與程式結束自動釋放。若系統有大量單例,每個都寫一遍極其繁瑣。欲提取可繼承基類,但 static s_instance 若定義在基類,所有子類共享同一指標,無法各自持有實例。
需讓每個子類擁有獨立的靜態實例指標。可利用 CRTP (Curiously Recurring Template Pattern) 或模板特化實現,使基類模板參數為子類型別,從而產生各自的靜態成員。後續將給出完整可繼承單例基類代碼。