单例模式的构造和析构问题

来源:互联网 发布:java两种时间格式转换 编辑:程序博客网 时间:2024/06/06 01:24
今天再看代码的过程中遇到一个问题,师哥指点后自己算是初步学习了下,现在记录一下我之前的知识盲点:单例模式(GOF23中有介绍)

一个简单的单例模式的实现过程:
一.首先看代码的实现:
class CSingleMode
{
public:
static CSingleMode* Instance()
{
if(m_pMemoryPools == NULL)
{
m_CSingleMode= (CSingleMode* )malloc(sizeof(CSingleMode));
m_CSingleMode->Init();
}
return *m_pMemoryPools;
}
public:
~CSingleMode(void);
private:
CSingleMode(void);
void Close();
void Init();
private:
static CSingleMode* m_CSingleMode;
};
二.单例模式的基本构成需要:

1.它有一个指唯一实例的静态指针m_CSingleMode,并且是私有的。

2.它有一个公有的函数,可以获取这个唯一的实例,并在需要的时候创建该实例:本例中就是static CSingleMode* Instance()函数实现了单例的构造和初始化;

3.它的构造函数是私有的,这样就不能从别处创建该类的实例:CSingleMode(void);

三.单例模式的清理:

所谓的单例就是,使用Instance函数之后不会再创建这个类的实例了,因为他是static的,然后就可以通过它的私有变量m_CSingleMode来使用这个类提供的功能和资源了;

那么m_CSingleMode指向的空间什么时候释放呢?更严重的问题是,这个实例的析构操作什么时候执行?

如果在这个构造函数中申请了资源或者打开了文件,网络等的,那么最稳妥的就是在析构的时候关闭这些资源,或者清除申请的资源,这样才能保证程序的正常运行,那么我们可以使用一个私有的函数来完成这个功能了:

void CSingleMode ::Close()
{
if (CSingleMode ::m_CSingleMode)
delete CSingleMode ::m_CSingleMode;
}
~CSingleMode(void)
{
close();
}
这样在程序退出的时候就会自动调用析构函数,然后用close()这个类的私有函数完成清理工作了,这样就可以放心的使用单例提供的资源了。
或者使用一个内嵌的清理类来完成这个功能:
class CSingleMode
{
public:
static CSingleMode* Instance()
{
if(m_pMemoryPools == NULL)
{
m_CSingleMode= (CSingleMode* )malloc(sizeof(CSingleMode));
m_CSingleMode->Init();
}
return *m_pMemoryPools;
}
public:
~CSingleMode(void);
private:
CSingleMode(void);
void Init();
static CSingleMode* m_CSingleMode;
//类Cleanall被定义为CSingleMode的私有内嵌类,以防该类被在其它地方滥用
class Cleanall
{
public:~Cleanall()
{
if (CSingleMode ::m_CSingleMode)
delete CSingleMode ::m_CSingleMode;
}
}
static Cleanall Cleanall;//定义一个静态成员,在程序结束时系统会调用它的析构函数
};
这样的好处在于:

1.在单例类内部定义专有的嵌套类。

2.在单例类内定义私有的专门用于释放的静态成员。

3.利用程序在结束时析构全局变量的特性,选择最终的释放时机。

4.使用C++单例模式的代码不需要任何操作,不必关心对象的释放。

原创粉丝点击