最近实习一直在看公司代码框架,看到许多用到了单例模式的地方。有些是直接写一个单例模式实现,有些则是继承自一个单例模板。
因为继承自单例模板的实现方式以前没有接触过,所以这里记录一下。
1、首先声明一个单例模式模板基类:
template<class T>
class Singleton {
public:
static T* get() {
static T t;
return &t;
}
protected:
//设为protected是为了以后的派生类继承它时可以调用构造函数
Singleton() {}
~Singleton() {}
private:
//拷贝构造函数和赋值运算都不被允许
Singleton(const Singleton& m);
Singleton& operator=(const Singleton& m);
};
2、然后令我们想运用单例模式的类继承自这个类
注意继承类时模板参数为该类本身,这样做据说是atl-style代码,既可以节省内存(因为不需要虚函数表),且所有函数的调用在编译时确定,因此它们是可以优化的(参考博客)
class DerivedSingleton : public Singleton<DerivedSingleton> //模板参数为DerivedSingleton
{
... //该类的其他实现细节
};
然后就实现了单例模式啦~
这里好像没有考虑到线程安全问题,需要的话可以看看这篇博客。