• 相对完善的单例模式


    相对完善的单例模式

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

    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

  • 相关阅读:
    Codeforces Round #246 (Div. 2):B. Football Kit
    iOS8使用TouchID
    HDU 1796 How many integers can you find(容斥原理+二进制/DFS)
    MapReduce的Reduce side Join
    Android入门级编译错误汇总
    当往事已随风
    静态链表的C++实现
    《跨界杂谈》企业商业模式(三):集约
    C
    Android插屏动画效果
  • 原文地址:https://www.cnblogs.com/leoTsou/p/16366818.html
Copyright © 2020-2023  润新知