诉求:期望咱们的 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;
}
}