您的位置:首页 > 其它

Singleton模式——设计模式学习

2017-03-16 00:05 337 查看
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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: