• Qt 单例模式


    单例模式的意图与作用:

      意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

      作用:主要解决一个全局使用的类频繁地创建与销毁。

      注意:在使用单例模式时构造函数是私有的。

    优点:

      1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。

      2、避免对资源的多重占用(比如写文件操作)。

    缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

     1 class SingleTon{
     2 public:
     3      static SingleTon &getInstance(void)
     4      {
     5          //双重检测加锁
     6          if(!instance){
     7              QMutexLocker locker(&mutex);
     8              if(!instance)
     9                  instance = new SingleTon;
    10          }
    11          return * instance;
    12      }
    13 private:
    14      SingleTon()
    15      SingleTon(const SingleTon & );
    16      SingleTon & operator = (const SingleTon &);
    17      QReadWriteLock internalMutex;
    18      static QMutex mutex;
    19      static QAtomicPointer<SingleTon> instance;
    20 };
    21 
    22 //初始化静态变量
    23 QMutex SingleTon::mutex;
    24 QAtomicPointer<SingleTon> SingleTon::instance = 0;

    修改:

     1 public:
     2      static SingleTon &getInstance(void)
     3      {
     4 #ifdef Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
     5          if(!QAtomicPointer::isTestAndSetNative())//运行时进行检测
     6               qDebug() << "Error: don's support TestAndSetNative!!!!!!"
     7 #endif
     8         //双重检测加锁
     9         /*  ! testAndSetOrders操作保证在原子操作前和后的的内存访问
    10         *    不会被重新排序。
    11         */
    12         if(instance.testAndSetOrdered(0,0)){    //第一次检测
    13              QMutexLocker locker(&mutex)        //加锁
    14              instance.testAndSetOrdered(0, new SingleTon);    //第二次检查
    15        }
    16        return * instance;
    17     }
    18 private:
    19     和上面代码一样

     

  • 相关阅读:
    【Java】SAX解析characters 错误截取问题的解决
    【Scala】Scala-调用Java-集合
    【Java】Java-XML解析利器-SAX-高性能-易用
    java.io.FileNotFoundException: D:xxxyyy (拒绝访问。)问题
    java-io-inputStream
    java-io-FileReader和FileWriter类
    java-io-FileInputStream与FileOutputStream类
    问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。
    软件设计-模块耦合
    结构化程序设计
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14919138.html
Copyright © 2020-2023  润新知