zoukankan      html  css  js  c++  java
  • 一个好用的单例类模板

    在程序开发中,某一个类对象经常需要在好多个类中使用,为测试方便,好多初学者声明一个该类的全局变量,然后在其它类中引用使用。

    但是,好的编码是能不用全局变量就不用全局变量。

    这些类对象往往时单一的对象,于是可以使用设计模式中的单例模式来很好地规避全局变量的使用。

     Singleton.h
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    #ifndef SINGLETON_H
    #define SINGLETON_H

    #include <QMutex>

    template<typename T, typename L = QMutex>
    class Singleton
    {
    public:
        
    template<typename ...Args>
        
    static T *getSingleton(Args&&... args)
        {
            
    if (!m_init)
            {
                
    if (nullptr == m_inst)
                {
                    m_lock.lock();
                    m_init = 
    new T(std::forward<Args>(args)...);
                    m_init = 
    true;
                    m_lock.unlock();
                }
            }
            
    return m_inst;
        }

    private:
        Singleton() {}

    private:
        
    static bool m_init;
        
    static T    *m_inst;
        
    static L    m_lock;
    };

    template<typename T, typename L>
    bool Singleton<T, L>::m_init = false;

    template<typename T, typename L>
    T *Singleton<T, L>::m_inst = nullptr;

    template<typename T, typename L>
    L Singleton<T, L>::m_lock;

    #endif // SINGLETON_H

    使用:

    您的类名 *对象指针名 = Singleton<您的类名>::getSingleton([构造函数参数列表,可选]);

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class WindowService
    {
    public:
        WindowService(
    const QString &name) { m_name = name; }
        ~WindowService() {}

    private:
        QString     m_name;
    };

    WindowService *winSvr = Singleton<WindowService>::getSingleton(
    "WindowService");

    祝您使用愉快!

  • 相关阅读:
    C语言中的异常处理
    silverlight与游戏中的人工智能基本追逐与闪躲(二)
    具有3D旋转效果的图片组的一种实现
    [转]ColorMatrixFilter颜色矩阵滤镜
    silverlight effect的一些整理
    silverlight练习之利用DridSplitter和Drid,Line制作可变行列宽度的表格
    str_replace函数详解
    《JavaScript高级程序设计(第2版)》
    FCKEditor+jQuery+PHP实现分页
    如何书写高效、可维护、组件化的CSS。
  • 原文地址:https://www.cnblogs.com/MakeView660/p/11639894.html
Copyright © 2011-2022 走看看