每天都會分享幾個有趣的Python小知識,現在給大家分享幾個適合新手練習的小項目,好玩不燒腦,提升技能不在話下。等會就叫你的室友跟你一起VS,輕輕鬆松成為捲王。 但是問題有三個: 1、你不知道已經有哪些輪子已經造好了,哪個適合你用。有名有姓的的著名輪子就400多個,更別說沒名沒姓自己在製造中的輪子。 ...
相對完善的單例模式
關於單例模式相比無須贅言,但是初學設計模式的時候都難免遇到使用單例模式時沒有考慮拷貝構造的問題。
這裡就嘗試實現幾個相對完善而且有擴展性的單例模式,以供參考。
Hello World 版本
class Singleton {
public:
Singleton *GetInstance() {
if (mThis != NULL)
return mThis;
mThis = new Singleton;
}
private:
static Singleton *mThis;
Singleton() {}
};
更完善的版本
一個完善的類應該考慮拷貝構造的問題,所以更完善的版本就呼之欲出了:
class Singleton {
public:
Singleton *GetInstance() {
if (mThis != NULL)
return mThis;
mThis = new Singleton;
}
private:
static Singleton *mThis;
Singleton() {}
Singleton(Singleton &obj) {/* ... */} // 處理好拷貝構造的問題
};
更簡潔的版本
如果你恰好和我一樣,知道一些C++11的知識,那麼就可以這麼做
class Singleton {
public:
Singleton *GetInstance() {
if (mThis != nullptr)
return mThis;
mThis = new Singleton;
}
private:
static Singleton *mThis;
Singleton() {}
Singleton(Singleton &obj) = delete; // 利用C++11的特性的版本
};
考慮擴展性的版本
如果你恰好和我一樣,會考慮擴展性的問題,那麼就可以這麼做
template <typename T>
class Singleton {
public:
template <typename T>
Singleton<T> *GetInstance() {
if (mThis != NULL)
return mThis;
mThis = new Singleton<T>;
}
private:
static Singleton<T> *mThis;
Singleton<T>() {}
Singleton<T>(Singleton &obj) = delete;
};
結束語
這個題目的討論就結束了。
至於關於單例模式的其他優化方式,什麼餓漢什麼線程的,前人已經討論了很多了。
在這裡只討論我的想法。
創作不易,如需轉載請附上原始url:https://www.cnblogs.com/leoTsou/p/16366818.html
痛苦苦苦苦苦苦苦苦苦並快樂著