接着上一篇《介紹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內的表達式爲假,將會彈出錯誤提示。