Singleton單例模式C++
阿新 • • 發佈:2018-12-31
單例模式好幾種
此處參考如下兩人學習;https://blog.csdn.net/cjbct/article/details/79266057
https://blog.csdn.net/liang19890820/article/details/61615495
程式碼部分參考如上,實現過程如下,基礎知識內容有所借鑑
單例類只能有一個例項
只允許自己建立自己
提供這個例項給其他所有物件
容易出錯位置;執行緒安全、建立時記憶體問題、拷貝建構函式的處理
所以產生處理如下幾種不錯的解決方案;
/**********************************************************************************************************************/
可以生成無數個指向同一地址的指標。 只能拷貝物件的地址
#pragma once //singlentonehan.h #ifndef SINGLENTONEHAN_H #define SINGLENTONEHAN_H /* 餓漢式 即類產生的時候就建立好例項物件,這是一種空間換時間的方式 執行緒安全 */ #include <iostream> using namespace std; class Singlentonehan { public: static Singlentonehan* GetInstanceehan(); private: Singlentonehan(); ~Singlentonehan(); Singlentonehan(const Singlentonehan&); Singlentonehan& operator=(const Singlentonehan&); }; Singlentonehan* Singlentonehan::GetInstanceehan() { static Singlentonehan instanceehan;//區域性靜態變數 return &instanceehan; } Singlentonehan::Singlentonehan() { cout << "建立Singlentonehan" << endl; } Singlentonehan::~Singlentonehan() { cout << "析構Singlentonehan" << endl; } #endif // !SINGLENTONLANHAN_H
#include <iostream> #include "singletonehan.h" using namespace std; int main() { Singlentonehan *s1 = Singlentonehan::GetInstanceehan(); Singlentonehan *s2 = Singlentonehan::GetInstanceehan(); cout << s1<< endl; cout << s2<< endl; system("pause"); return 0; }
/*******************************************************************************************************************************/
採用是引用,使用時注意不能拷貝
#pragma once
//singlentonehan.h
#ifndef SINGLENTONEHAN_H
#define SINGLENTONEHAN_H
/*
餓漢式
即類產生的時候就建立好例項物件,這是一種空間換時間的方式
執行緒安全
*/
#include <iostream>
using namespace std;
class Singlentonehan
{
public:
static Singlentonehan& GetInstanceehan();
private:
Singlentonehan();
~Singlentonehan();
Singlentonehan(const Singlentonehan&);
Singlentonehan& operator=(const Singlentonehan&);
};
Singlentonehan& Singlentonehan::GetInstanceehan()
{
static Singlentonehan instanceehan;//區域性靜態變數
return instanceehan;
}
Singlentonehan::Singlentonehan()
{
cout << "建立Singlentonehan" << endl;
}
Singlentonehan::~Singlentonehan()
{
cout << "析構Singlentonehan" << endl;
}
#endif // !SINGLENTONLANHAN_H
#include <iostream>
#include "singletonehan.h"
using namespace std;
int main()
{
Singlentonehan::GetInstanceehan();
Singlentonehan::GetInstanceehan();
system("pause");
return 0;
}
/*******************************************************************************************************************************/
多執行緒和靜態成員方法還未嘗試