相对完善的单例模式

关于单例模式相比无须赘言,但是初学设计模式的时候都难免遇到使用单例模式时没有考虑拷贝构造的问题。
这里就尝试实现几个相对完善而且有扩展性的单例模式,以供参考。

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

posted on 2022-06-11 21:12  LeoTsou  阅读(127)  评论(0编辑  收藏  举报