所谓Singleton模式,其主要作用是保证在应用程序中,一个类Class只有一个实例存在。 在软件开发中,Singleton模式应该是使用比较广泛的一个模式了,例如,实现Log系统的类、全局配置的类,以及建立目录、数据库连接的类、全局统计的类等等,都可以使用Singleton模式来实现。因为通常这些类,只允许一个实例存在,而且该实例可以在其他任何对象、任何函数中都可以被调用。
在C++中使用Singleton模式,要注意的问题,也是如何管理该对象所使用的内存了,呵呵!对内存的管理,真的是一个老生常谈的事情,可是又不得不考虑!是呀,Singleton对象的内存怎么释放呢?因为该对象通常是为系统中所有其他对象服务的,而C++中又没有垃圾回收机制。正因为如此,很多人选择不释放其内存,因为通常Singleton对象的生命周期,会一直到应用程序运行结束,程序结束后,可以由操作系统来回收内存。当前,大多数的操作系统都可以完成这个工作,可这实在不是一个好习惯。
有没有更好的方法呢?当然有,那就是不要使用指针,即,不要象《设计模式》这本书里面叙述的那样实现Singleton,而是如下来实现:
class SingletonTest
{
protected:
SingletonTest() {} // 将构造函数保护起来
public
static SingletonTest& getInstance(); // 使用instance来创建对象
};
SingletonTest& SingletonTest::getInstance()
{
static SingletonTest instance; // 申明对象时,使用static
return instance;
}
使用该对象的方法如下:
SingletonTest::getInstance().函数名;
或:
SingletonTest* test = &SingletonTest::SingletonTest();
test->函数名
由于getInstance中,申明对象时使用了static,所以调用getInstance只会运行一次申明对象的那条语句,也就是,只会在系统中创建一个SingletonTest实例,又由于所创建的SingletonTest实例不是指针,在程序结束时,会将内存释放给操作系统。