C 單例模式

2021-06-27 16:30:44 字數 3114 閱讀 9897

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 ...