实习学到的一些东西(二)

最近实习一直在看公司代码框架,看到许多用到了单例模式的地方。有些是直接写一个单例模式实现,有些则是继承自一个单例模板。
因为继承自单例模板的实现方式以前没有接触过,所以这里记录一下。

1、首先声明一个单例模式模板基类:

template
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
{
    ... //该类的其他实现细节
};

然后就实现了单例模式啦~
这里好像没有考虑到线程安全问题,需要的话可以看看这篇博客。

你可能感兴趣的:(实习心得)