接着上一篇《介绍MFC框架中涉及到的设计模式(一)》介绍
单例模式(Singleton Pattern)
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
单例模式的要点有三个: 1.某个类只能有一个实例;
2.它必须自行创建这个实例;
3.它必须自行向整个系统提供这个实例。
单例模式典型的结构图如下所示:
由上图我们可以了解到,我们通过维护一个static成员变量来记录这个唯一的对象实例,通过一个Instance()接口来获得这个唯一的实例。
下面是一个用C++语言实现的Singleton模式的小例子帮助大家理解单例模式。注意(VC6.0可以运行)
代码片断1:Singleton.h //Singleton.h #ifndef _SINGLETON_H_ #define _SINGLETON_H_ #include <iostream> using namespace std; class Singleton { public: static Singleton* Instance(); //获取唯一实例对象的接口 protected: Singleton(); //防止被外界调用实例化。也可以声明成private private: static Singleton* _instance; //保存唯一的实例对象 }; #endif //~_SINGLETON_H_ 代码片断2:Singleton.cpp //Singleton.cpp #include "Singleton.h" #include <iostream> using namespace std; Singleton* Singleton::_instance = 0; Singleton::Singleton() { cout<<"Singleton...."<<endl; } Singleton* Singleton::Instance() { if (_instance == 0) { _instance = new Singleton(); } return _instance; } 代码片断3:main.cp //main.cpp #include "Singleton.h" #include <iostream> using namespace std; int main(int argc,char* argv[]) { Singleton* sgn = Singleton::Instance(); return 0; }
我们来看一下MFC中有关的单例模式。
每一个MFC应用实例都派生于类CWinApp,每个应用程序都只应该有一个派生于CwinApp的实例。CwinApp在设计上保证了一个应用程序不能生成多个实例,并且提供了一系列的函数用于对该唯一对象的一些属性的访问,包括AfxGetApp,AfxGetInstanceHandle,AfxGetResourceHandle,AfxGetAppName等作为获取唯一实例对象的接口。
MFC是通过ASSERT来防止多次构造CWinApp对象的。在第二次构造CwinApp对象时,ASSERT内的表达式为假,将会弹出错误提示。