zoukankan      html  css  js  c++  java
  • C++ 单例模式

        单例模式是最常用的设计模式之一,对单例的理解:一个类有且只有一个对象(只能实例化一次,不能进行拷贝,赋值),并提供一个全局访问接口。例如windows中的任务管理器,打印机管理程序等。
    现在就单例模式的几种实现方式进行比较:
    1、最常见的单例写法
            使用static私有变量,并提供一个静态方法作为单例的接口。让构造成为私有的,即该对象不能通过类外进行实例化。
    1. class Singleton
    2. {
    3. public:
    4. void myInfo();
    5. static Singleton * getInstance();
    6. private:
    7.     Singleton();
    8. ~Singleton();
    9. static Singleton * m_sglton ;//(此处也可直接写为静态变量)
    10. };
    11. Singleton* Singleton:: m_sglton = NULL;//初始化在主线程之前
    12. Singleton *Singleton::getInstance()
    13. {
    14. if(m_sglton == NULL)
    15. {
    16. m_sglton = new Singleton;
    17. }
    18. return sglton;(返回对象)
    19. }
            优点:简单易于理解,缺点容易忘记释放内存。
    2、静态局部变量的写法
    •     返回了静态局部对象的指针
           不用担心内存释放的问题,
    1. class Singleton
    2. {
    3. public:
    4. void myInfo();
    5. static Singleton * getInstance();
    6. private
    7.      Singleton();
    8. ~Singleton();
    9. :
    10. };
    11. Singleton *Singleton::getInstance()
    12. {
    13. static Singleton siglton;
    14. return &siglton;
    15. }

    •   返回静态局对象的引用,由于担心发生该对象的拷贝,将其拷贝构造和赋值构造改为私有函数。
    1. class Singleton
    2. {
    3. public:
    4. void myInfo();
    5. static Singleton &getInstance();
    6. private:
    7.     Singleton();
    8. ~Singleton();
    9. Singleton(const Singleton &);
    10. Singleton &operator =(const Singleton &);
    11. };
    12. Singleton &Singleton::getInstance()
    13. {
    14. static Singleton siglton;
    15. return siglton;
    16. }
       Singleton test = Singleton::geInstance();这种情况出现时,编译报错。

    线程安全问题:
            当使用静态局部变量,在多线程时,会出现线程安全问题,即线程重入。而静态成员变量的写法因为在main函数执行之前就已经进行了初始化,所以不必考虑线程安全问题。

    • 对静态局部变量采取线程安全的写法(加锁)
    class Singleton
    {
    public:
    void myInfo();
    static Singleton &getInstance();
    private:
    Singleton();
    ~Singleton();
    Singleton(const Singleton &);
    Singleton &operator =(const Singleton &);
    };

    Singleton &Singleton::getInstance()
    {
    Lock();
    static Singleton siglton;
    UnLock();
    return siglton;
    }
    发现问题
            细心的读者可能发现了一个问题,我在使用单例模式的时候,在其静态成员函数中实例化了一个对象,该对象的私有构造函数得到执行(非静态成员函数执行)。这与静态函数不能调用类的非静态成员规则矛盾吗?
           下一篇《静态成员函数与私有构造函数与》将会对这块内容进行探索!







  • 相关阅读:
    最大堆的实现
    更新Android SDK Manager Mac下修改hosts
    快速排序
    含有通配符的字符串匹配(递归)
    geopandas安装问题记录:ImportError,DLL load failedwindows10
    silveright 5.0 搜索代码生成系统
    Insert xml to DB Column
    Enter/Esc Hot Key Silverlight
    Silverlight 页面保存为html出现乱码的问题
    Use dynamic SQL to fix openrowset parameter and Insert xml files into database under given folder
  • 原文地址:https://www.cnblogs.com/chengkeke/p/5417371.html
Copyright © 2011-2022 走看看