c 單例模式

2021-09-05 11:41:00 字數 2160 閱讀 9292

什麼是單例模式?

單例模式就是乙個類只能被例項化一次,即只有乙個例項化的物件的類。

建立乙個單例模式的類

乙個類只能由乙個例項化的物件,即這個類就要禁止被new出來,或者通過直接定義乙個物件出來。

class car

~car(){}

};car a;

car *b = new car;

上面**很明顯可以被以兩種方法例項化出來,所以怎樣可以禁止式用上述兩種方法例項化乙個類?

可以看出,這兩種例項化類的方法都會呼叫建構函式,那麼我們是不是可以不讓建構函式在外部使用?

class singleton

//把複製建構函式和=操作符也設為私有,防止被複製

singleton(const singleton&);

singleton& operator=(const singleton&);

};int main()

通過上面的**,可以看出,當建構函式被設定為私有的後,這兩種例項化類的方法就使用不了了,因為私有化的建構函式外部不能使用。

error: 『csingleton::csingleton()』 is private

既然建構函式私有了,那麼只能被類內部使用了,所以可以提供乙個共用的函式供外部使用,然後這個函式返回乙個物件。為了保證這個函式多次呼叫 返回的是乙個物件,所以抱著個函式設定為靜態的,於是有了下面的**:

#includeusing namespace std;

class singleton

static singleton* m_instace;

private:

singleton(){}

//把複製建構函式和=操作符也設為私有,防止被複製

singleton(const singleton&);

singleton& operator=(const singleton&);

};singleton* singleton::m_instace = new singleton;

int main()

執行**發現

這種模式優點就是空間換時間。

還有一種單例模式的實現被稱為懶漢模式(時間換空間),即第一次使用時,才例項化物件。

class singleton

return m_instace;

} static singleton* m_instace;

private:

singleton(){}

};singleton* singleton::m_instace=nullptr;

於是上面的**就能解決,但是發現如果兩個執行緒同時獲取例項化物件呢?顯然是不行的,會出現兩個執行緒同時要物件的時候指標還都是空的情況就完了,想到這種情況你肯定會毫不猶豫的去加個鎖。但是只加鎖回導致多執行緒下阻塞機會加大,因此實現雙層檢測。

#include #include #incldue using namespace std;

class singleton

m_mtx.unlock();

} return m_instace;

} void print()

class delete

} static delete d;

};private:

singleton(){}

singleton(const singleton&) = delete;

singleton& operator=(const singleton&) = delete;

static singleton* m_instace; //單例物件指標

static mutex m_mtx; //互斥鎖

};void func(int n)

singleton* singleton::m_instace = nullptr;

mutex singleton::m_mtx;

singleton::delete d;

int main()

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