诉求:期望咱们的 class 只要一个目标

源码解析

class CLbTransfLog
{
public:
    ~CLbTransfLog(void)
    {
    }
    static CLbTransfLog* GetInstancePtr(void)
    {
            static CLbTransfLog m_sLBIMLog;
            return &m_sLBIMLog;
    }
private:
    CLbTransfLog(void)
            : m_strLogFileName(_T(""))
            , m_strDBLogFileName(_T(""))
    {
    }
    CLbTransfLog(const CLbTransfLog& other);
}

这是一个单例方式的完成。单例方式是一种创立型设计方式,用于保证一个类只要一个实例,并供给一个拜访该实例的大局拜访点

单例方式的一般特色

这段代码也能够反映单例方式的一般特色

  • 类的结构函数是私有的

    CLbTransfLog 类的结构函数是私有的,因此外部无法直接创立该类的目标。

  • 供给一个拜访类实例的大局拜访点

    这里供给了一个静态的 GetInstancePtr() 办法,用于获取 CLbTransfLog 类的唯一实例。

  • 运用 static 创立静态局部变量

    GetInstancePtr() 办法内部运用静态局部变量完成了慵懒初始化,保证仅在初次调用该办法时才会创立实例。

    而且这个目标 static CLbTransfLog m_sLBIMLog;它不归于任何一个类的目标,从创立的一刻,就在内存中某一个区域就存在了,而且只要一份。因此,无论多少次调用 GetInstancePtr() 办法,它都回来同一个实例的指针。

这种完成方法的好处在于,它能够保证系统中只要一个 CLbTransfLog 类的实例,然后避免了实例的重复创立和资源糟蹋。此外,它还供给了一个大局拜访点,使得任何地方都能够拜访到该实例,方便了程序的编写和管理。

咱们还看见过下面的写法

class CLbTransfLog
{
public:
    ~CLbTransfLog(void)
    {
    }
    static CLbTransfLog& GetInstancePtr
    {
            return m_sLBIMLog;
    }
    void setup(){...};
private:
    CLbTransfLog(void)
            : m_strLogFileName(_T(""))
            , m_strDBLogFileName(_T(""))
    {
    }
    CLbTransfLog(const CLbTransfLog& other);
    static CLbTransfLog& m_sLBIMLog;
}

这种写法是在没有人创立 CLbTransfLog 目标的时分,CLbTransfLog 就有一个变量了,占有一个空间了。

不想让外界创立 CLbTransfLog ,就把他的结构函数放在 private 中。

外界只能经过静态函数 GetInstancePtr 函数,获取到唯一的 m_sLBIMLog,接下来就能够经过唯一的 m_sLBIMLog,获取类中的各种函数了,比如,m_sLBIMLog.setup()。

能够看出来这种写法有一个缺陷,假如外界没有用到这个类,这个类的静态变量依然存在,这就有一点糟蹋,所以更好的写法还是第一种。

两种写法的区别

这两种写法的区别在于,第二种写法将 m_sLBIMLog 界说为静态局部变量,外界没有运用这个类的时分,这个类的静态变量依然存在。而第一种写法将 m_sLBIMLog 界说为静态成员变量,并经过类外部的创立来初始化它,假如外界没有人运用这个类,将不会创立这个单例。

单例方式模板总结

第一种(更好,自己编码运用)

class A
{
public:
    static A& getInstance();
    setup(){...}
    ...
private:
    A(); // 类私有结构函数
    A(const A& rhs);
    ...
}
A& A::getInstance()
{
    static A a; // 期望只要一份的类实例
    return a;
}

指针方式

class A
{
public:
    static A* getInstance();
    setup(){...}
    ...
private:
    A(); // 类私有结构函数
    A(const A& rhs);
    ...
}
A* A::getInstance()
{
    static A a; // 期望只要一份的类实例
    return &a;
}

第二种(会识别)

class A
{
public:
    static A& getInstance() {return a;};
    setup(){...};
    ...
private:
    A(); // 类私有结构函数
    A(const A& rhs);
    static A a; // 期望只要一份的类实例
    ...
}

指针的方式

class A
{
public:
    static A* getInstance();
    static void releaseInstance();
private:
    A();
    ~A();
private:
    static A* m_pInstance;
}
A* A::m_pInstance = nullptr;//界说,赋初值
A* A::getInstance()
{
    if (nullptr == m_pInstance)
    {
        m_pInstance = new A();
    }
    return m_pInstance;
}
void A::ReleaseInstance()
{
    if (nullptr != m_pInstance)
    {
        delete m_pInstance;
        m_pInstance = nullptr;
    }
}