flyfish 2014-12-16
單例模式是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有乙個例項存在。
編寫乙個singleton類
class singleton(){}; 該類是空類
經過編譯器處理後,c++編譯器預設編寫的函式**如下
class singleton()
// 1 建構函式
singleton(const singleton& s{} // 2 拷貝建構函式
~singleton(){} // 3 析構函式
singleton& operator=(const singleton& s{} // 4 拷貝賦值函式 copy assignment
};
1 禁止使用者建立物件
將singleton類的建構函式,拷貝建構函式,拷貝賦值函式 全部宣告為private,這樣使用者都沒有權力建立物件
private:
singleton() {};
singleton(singleton const&);
void operator=(singleton const&);
2 使用者可以呼叫
利用public成員函式來進行訪問
介面函式static singleton& getinstance()
3 執行緒安全,保證物件的唯一
靜態成員物件(static member objects )是不是物件的一部分
從c++11 開始 如果靜態成員宣告為thread_local,每乙個執行緒都有這樣的乙個object,否則在整個程式中的靜態成員物件只有乙個例項,也就是在c++11 如果宣告了靜態成員,那麼這個靜態成員是執行緒安全的。
對於什麼時候建立物件有兩種方案供選擇
eager evaluation和lazy evaluation
eager evaluation是在程式啟動時就要建立物件
最快的計算就是不計算,需要的話就是開始建立物件,不需要就不建立物件這就是惰性求值(lazy evaluation)
lazy evaluation的目的就是要最小化計算機要做的工作。
c++ 11 + lazy evaluation
實現如下
class singleton
private:
singleton() {};
singleton(singleton const&);
void operator=(singleton const&);
};
編譯器不支援c++11,可以參考boost的實現
**在boost資料夾的位置
boost\core\noncopyable.hpp
boost\serialization\singleton.hpp
簡化可以看的清楚些
class noncopyable
~noncopyable() {}
private:
noncopyable( const noncopyable& );
noncopyable& operator=( const noncopyable& );
};//noncopyable允許繼承,
//利用private宣告禁止子類呼叫賦值和拷貝建構函式
//利用protected宣告禁止除了子類以外的其他類呼叫建構函式和析構函式
//只能由子類呼叫構造和析構函式建構函式和析構函式
typedef noncopyable_::noncopyable noncopyable;
class singleton_module : public boost::noncopyable
public:
static void lock()
static void unlock()
static bool is_locked()
};};
template class singleton : public singleton_module
static t & get_instance()
public:
static t & get_mutable_instance()
static const t & get_const_instance()
static bool is_destroyed()
};templatet & singleton< t >::instance = singleton< t >::get_instance();
c++11 利用 可變引數模板 實現的單例模式
#pragma once
template class singleton
return m_pinstance;
} static t* getinstance()
return m_pinstance;
} static void destroyinstance()
private:
singleton(void);
virtual ~singleton(void);
singleton(const singleton&);
singleton& operator = (const singleton&);
private:
static t* m_pinstance;
};template < class t> t* singleton::m_pinstance = nullptr;
//使用方式
class a;};
//使用方式
singleton::instance();
singleton::getinstance()->test();
singleton::destroyinstance();
C 單例模式
include using namespace std 單例類的c 實現 class singleton 構造方法實現 singleton singleton void singleton setvar int var main int main int argc,char argv return ...
C 單例模式
實現方式一 include template typename t class singleton boost noncopyable static void init private static pthread once t ponce statict value template typena...
C 單例模式
效率有點低,但是還算安全的單例模式,靜態成員實現方式 class singleton public static singleton getinstance singleton singleton getinstance unlock return m instance 內部靜態例項的懶漢模式,c ...