确保程序的某一个类在运行的时候只生成一个对象,拥有对它类似于全局对象的访问权限。
例如很多时候我们在写程序的时候会有类似于DriverManager,CallManager等等这样的管理类,它们主要的功能就是为了管理一堆相似的对象。对于这种管理类,一个程序一般只有一个对象,毕竟我们写出管理类的目的就是为了便于管理,管理类的对象多了也就失去了管理的意义了,而且还有一点我们在程序中肯定会有很多地方需要直接访问到这个对象,毕竟一个程序很多地方都需要通过管理类找到对应的Driver,对应的Call等等。
class CallManager { public: static CallManager* GetInstance(){ if(instance_ == NULL){//注意这个只有在第一次调用才会创建对象 instance_ = new CallManager(); } return instance_; } private: static CallManager* instance_;//注意这个为静态私有对象 CallManager();//注意这个为私有 }
static CallManager* CallManager::instance_ = NULL;
static void DestroyInstance(){ delete instance_; instance_ = NULL; }
public: CallManager* GetInstance(){ static CallManager localManager; return &localManager; }通过这种局部静态的使用既省去了DestroyInstance的调用,同时可以确保它一定会被释放,还省去了instance_成员变量,何乐而不为呢?建议采用。
#include <stdio.h> class CallManager { public: static CallManager* GetInstance(){ static CallManager localManager; return &localManager; } ~CallManager(){ printf("CallManager Destructed...\n"); } private: CallManager(){//注意这个为私有 printf("CallManager Constructed...\n"); } };请注意虽然我将函数的实现写在了类的声明里面,但是请注意这并不是我本意。我是为了简单,其实应该分成h和cpp文件的,这样可以降低编译依赖,而且默认内联也不是我们想要的,具体的细节不再赘述。
#include <assert.h> #include <CallManager.h> int main(){ CallManager* pCallManager = CallManager::GetInstance(); CallManager* pCallManager2 = CallManager::GetInstance(); assert(pCallManager == pCallManager2);//确认是完全一样 return 0; }
CallManager Constructed... CallManager Destructed...与我们所想一致,由初始化构建,只构建一次,在main结束之后被自动释放。Wonderful。