單例模式(Singleton):保證一個類僅有一個實例,並提供一個訪問它的全局訪問點。
UML類圖:
實現方法:
1.創建一個指向唯一實例的靜態指針,並且是私有的。
2.提供一個公用的接口,已獲取這個唯一的實例,如果唯一實例不存在,在接口內部首先將它創建出來。
3.將類的構造函數設置為私有的,保證用戶不能通過其它方式創建實例。
4.將類的析構函數設置為私有的,因為類只有一個實例,不能讓用戶隨便刪除,這樣用戶調用delete來釋放實例對象時,編譯器會報錯,指示非法。
單例模式基本代碼如下:
[cpp]
/********************************************************************
filename: Singleton.h
created: 2012-09-24
author: firehood
purpose: firehood 學設計模式之---單例模式
*********************************************************************/
#include<stdio.h>
#pragma once
class Singleton
{
public:
static Singleton* GetInstance(void);
private:
static void Destory(void);
Singleton(void);
~Singleton(void);
Singleton(const Singleton&);
Singleton& operator = (const Singleton&);
private:
static Singleton* pInstance;
};
[cpp]
/********************************************************************
filename: Singleton.cpp
created: 2012-09-24
author: firehood
purpose: firehood 學設計模式之---單例模式
*********************************************************************/
#include "Singleton.h"
#include <iostream>
using namespace std;
Singleton* Singleton::pInstance = NULL;
Singleton::Singleton(void)
{
}
Singleton::~Singleton(void)
{
}
Singleton* Singleton::GetInstance(void)
{
if(pInstance == NULL)
{
pInstance = new Singleton();
// 注冊終止函數(進程退出時調用)
atexit(Destory);
}
return pInstance;
}
void Singleton::Destory(void)
{
if(pInstance)
{
cout<< "釋放實例內存.."<<endl;
delete pInstance;
pInstance = NULL;
}
}
客戶端調用代碼:
[cpp]
#include "Singleton.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[])
{
cout<<"*************************************"<<endl;
cout<<"firehood 學設計模式之---單例模式"<<endl;
cout<<"*************************************"<<endl;
Singleton* pInstance1 = Singleton::GetInstance();
cout<<"實例1:"<<hex<<pInstance1<<endl;
Singleton* pInstance2 = Singleton::GetInstance();
cout<<"實例2:"<<hex<<pInstance2<<endl;
if(pInstance1 == pInstance2)
{
cout<<"實例1和實例2為同一個實例"<<endl;
}
system("pause");
return 0;
}
運行結果:
*************************************
firehood 學設計模式之---單例模式
*************************************
實例1:003A64E8
實例2:003A64E8
實例1和實例2為同一個實例
請按任意鍵繼續. . .
釋放實例內存..