单例模式通常也被叫做单件模式
在我们的编程的过程中有很多的地方都要用到单例模式,就是使用时需要仅仅有一个实例,并提供一个访问它的全局的访问点,供全部可用到它的程序模块的共享。它又很多的实现的方法,通常情况下仅仅一个全局的变量就可以实现一个简单的单例。这里介绍的是用一个单体类来实现单例模式,用的是一个类静态私有指针变量指向类的唯一的实例,同时用一个静态的共有的方法获取这个实例。
比如:
class Singnal {
//其他的成员
public:
static Singnal * getInstance(){
if( pInstacne == NULL) {
pInstance = new Singnal();
}
return pInstance ;
}
private:
Sinanal() {};
static Singnal* pInstance;
}
这样就实现了一个单例类;
在这个单体类中你可以看到以下几点是实现这个单体类的关键:
1.构造函数是私有的,所以在其他的地方就不能实例化这个类的对象。
2.有一个静态私有的类的指针,指向唯一的实例。
3.同时有一个共有的方法来获取实例。
下面介绍对象释放的控制,其实很容易你就可以看出来在上面的程序中有个问题就是怎么去delete这个唯一的指针,首先有一个很简单的方法就是在程序结束的时候用共有的方法getInstance()先获取指针接着delete。这个方法有个很不好的地方那个就是容易忘记delete还有你也不能够保证是否会在随后的程序中再次用到getInstance();
第二个很有效的方法就是根据系统会在程序结束的时候自动析构所有的全局变量,同时他也会析构类的静态的成员变量。利用这个特征我们在上面的类中定义一个类的静态成员变量,一边在程序结束的时候用来析构我们上面定义的那个类的私有的静态的指针。比如加入类:代码中的TrashClean类。
class Singnal {
//其他的成员
public:
static Singnal * getInstance(){
if( pInstacne == NULL) {
pInstance = new Singnal();
}
return pInstance ;
}
private:
class TrashClean {//内嵌类 是用来消除单例模式的实例即:单例类的私有的静态的指针
public:
TrashClean() {}
virtual ~TrashClean() {
if(pInstance != 0)
delete pInstance;
}
};
Sinanal() {
static TrashClean mTrash; // 定义一个静态成员,在程序结束时,系统会调用它的析构函数
}
static Singnal* pInstance;
}
类TrashClean 被定义为Singnal 的私有内嵌类,以防该类被在其它地方滥用。
在程序运行结束时,系统会调用Singnal 的静态成员TrashClean 的析构函数,该析构函数会删除单例的唯一实例。
使用这种方法释放单例对象有以下特征:
1. 在单例类内部定义专有的嵌套类。
2.在单例类内定义私有的专门用于释放的静态成员。
3. 利用程序在结束时析构全局变量的特性,选择最终的释放时机。
4.使用单例的代码不需要任何操作,不必关心对象的释放。