디자인 모드 singleton 템 플 릿 클래스 구현

10950 단어
왜 템 플 릿 을 사용 합 니까? 프로젝트 의 대량의 클래스 는 유일한 대상 만 필요 하고 이 대상 들 은 다른 클래스 에 의 해 대량으로 인용 되 기 때 문 입 니 다.
코드 를 보 니 인터넷 에 유사 한 코드 가 많 습 니 다. 저 는 mutex 에서 qt 를 사 용 했 습 니 다.
#ifndef SINGLETON_H
#define SINGLETON_H
 
  
#define __instance(cls) Singleton::getInstance()
 
  
#include "Header.h"
 
  
template <class T>
class Singleton
{
public:
    static T* getInstance();
 
  
protected:
    Singleton(){};
 
  
private:
    Singleton(const Singleton&){};//    
    virtual ~Singleton() {};
 
  
    Singleton& operator=(const Singleton&){};//    
    static T* m_instance;
    static QMutex m_lock;
};
 
  
//  
template <class T> T* Singleton<T>::getInstance()
{
    if (nullptr == m_instance)
    {
        m_lock.lock();
        if (nullptr == m_instance)
        {
            m_instance = new T();
        }
        m_lock.unlock();
    }
    return m_instance;
}
 
  
template <class T> T* Singleton<T>::m_instance = nullptr;
template <class T>  QMutex Singleton<T>::m_lock;
 
  
#endif // SINGLETON_H


어떻게 사용 할 까요? 다음은 제 가 직접 쓴 Err 스 레 드 안전 관리자 입 니 다. 아래 를 보 세 요. friend 류 는 Public proctected 와 상 관 없 이 어디 에 두 어도 됩 니 다.
아주 간단 하지 않 습 니까? 사용 할 때 직접instance(ErrMgr)->getLastErr();
#ifndef ErrMgr_H
#define ErrMgr_H
 
  
#include "Header.h"
 
  
class ErrMgr : public QObject
{
    Q_OBJECT
    friend class Singleton<ErrMgr>;
 
  
public:
    void resetErr();//    
    void addErr(QString str);//        
    QString getLastErr();//      
 
  
private:
    explicit ErrMgr(QObject *parent = 0);
 
  
private:
    QQueue<QString> m_arErrs;//      
    QMutex m_mutexErrs;//   
    
};
 
  
#endif // ErrMgr_H

좋은 웹페이지 즐겨찾기