单例模式 是一种创建类型的模式,通过隐藏构造和析构函数,实现在内存中仅有一个对象 的目的。
Singleton的这种实现方式是非常有价值的,在多个模块或者多个线程中进行访问,可以不需要传递对象或者指针,通过引入头文件即可实现在不同模块解耦。
先来看Singleton的代码实现:
#ifndef _SINGLETON_H_
#define _SINGLETON_H_
/** Singleton宏定义*/
#define SINGLETON_DEFINITION(ClassName) \
\
protected: \
static ClassName##* m_pThis; \
\
ClassName##(); \
~ClassName##(); \
\
public: \
/** get instance*/ \
static ClassName##* Instance() \
{ \
if (!m_pThis) \
{ \
m_pThis = new ClassName##(); \
} \
return m_pThis; \
} \
/** clean up*/ \
static void CleanUp() \
{ \
if(m_pThis) \
{ \
delete m_pThis; \
m_pThis = 0; \
} \
}
/** 初始化*/
#define SINGLETON_IMPLEMENTATION(ClassName) ClassName##* ClassName##::m_pThis = NULL;
#endif // _SINGLETON_H_
类定义与实现可以直接调用宏,实现简洁的代码:/** Class类定义*/
class ClassName
{
SINGLETON_DEFINITION(ClassName)
public:
…
};
/** Class类实现*/
SINGLETON_IMPLEMENTATION(ClassName)
ClassName::ClassName()
{}
ClassName::~ClassName()
{}
…
有人说在23种设计模式里面,Singleton是使用最广泛的一种,对于这个观点作者并不反对,但从难度上来看,一直是有着Argue,争论点Focus在线程安全上,如何实现线程安全的Singleton呢?
加锁!加锁的目的在于避免多线程同时创建和删除。
在哪儿加锁呢?当然是在创建和删除时,也就是对应上面的 if(!m_pThis) 与 if(m_pThis) 代码段内,这里直接用个互斥信号量Mutex就可以了,非常简单,留给读者自己实现!