Singleton模式——设计模式学习

来源:互联网 发布:伤心太平洋知乎 编辑:程序博客网 时间:2024/05/22 15:19

Singleton

一 意图

  保证一个类仅有一个实例,并提供一个访问的全局访问点。

二 结构

       为什么需要仅有一个类的单例类呢?在很多种情况下,一个系统只需要此类的一个实例就够了:一个窗口管理器,一个消息通知器,一个数据存储器……

       有时候只能有一个:系统共用一个存储器,很多地方访问到存储器,必须要保证存储器唯一。

三 代码实现

复制代码
class Singleton
{
protected:
Singleton()
{
cout<<"Singleton constructor"<<endl;
}
public:
static Singleton* getInstance()
{
if (s_instance == NULL)
{
new Singleton();
}
return s_instance;
}
static closeIstance()
{
if (s_instance != NULL)
{
delete s_instance;
s_instance = NULL;
}
}
private:
static Singleton* s_instance;
};
Singleton* Singleton::s_instance = NULL;
int main()
{
Singleton* single = Singleton::getInstance();
return 0;
};
复制代码

从结构上来看是看起来非常的简单,因为这仅仅是对类的使用方式进行了限制,使对类实例创建得到更容易控制。


四 实例分析

       事件通知栏实现:

  

 

平台上单例类的实现方式:

两个宏

1 声明

复制代码
#define VFX_OBJ_DECLARE_SINGLETON_CLASS(_className)                             \
public: \
static _className *getInstance(); \
static void closeInstance(); \
private: \
static VfxU8 s_InstanceBuf[]; \
static _className *s_instance
复制代码

 

2 实现

复制代码
#define VFX_OBJ_IMPLEMENT_SINGLETON_CLASS(_className)                           \
_className *_className::getInstance() \
{ \
if (s_instance == NULL) \
{ \
new (s_InstanceBuf) _className(); \
s_instance = (_className *)s_InstanceBuf; \
s_instance->init(NULL); \
} \
return s_instance; \
} \
\
void _className::closeInstance() \
{ \
if (s_instance != NULL) \
{ \
s_instance->deinit(); \
s_instance = NULL; \
} \
} \
\
VfxU8 _className::s_InstanceBuf[sizeof(_className)]; \
_className *_className::s_instance = NULL
复制代码
0 0
原创粉丝点击