1. 程式人生 > >C++設計模式-單例的實現以及使用場景

C++設計模式-單例的實現以及使用場景

模式

在一定環境中解決某一問題的方案,包括三個基本元素--問題,解決方案和環境。

大白話:在一定環境下,用固定套路解決問題。

設計模式(Design pattern

是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 毫無疑問,設計模式於己於他人於系統都是多贏的;設計模式使程式碼編制真正工程化。

單利模式應該用場景:

核心作用:保證一個類只有一個例項,並且提供一個訪問該例項的全域性訪問點

應該在什麼時候下使用單例模式?

  舉一個小例子,在我們的windows桌面上,我們打開了一個回收站,當我們試圖再次開啟一個新的回收站時,Windows系統並不會為你彈出一個新的回收站視窗。,也就是說在整個系統執行的過程中,系統只維護一個回收站的例項。這就是一個典型的單例模式運用。

  繼續說回收站,我們在實際使用中並不存在需要同時開啟兩個回收站視窗的必要性。假如我每次建立回收站時都需要消耗大量的資源,而每個回收站之間資源是共享的,那麼在沒有必要多次重複建立該例項的情況下,建立了多個例項,這樣做就會給系統造成不必要的負擔,造成資源浪費。

  再舉一個例子,網站的計數器,一般也是採用單例模式實現,如果你存在多個計數器,每一個使用者的訪問都重新整理計數器的值,這樣的話你的實計數的值是難以同步的。但是如果採用單例模式實現就不會存在這樣的問題,而且還可以避免執行緒安全問題。同樣多執行緒的執行緒池的設計一般也是採用單例模式,這是由於執行緒池需要方便對池中的執行緒進行控制

  同樣,對於一些應用程式的日誌應用,或者web開發中讀取配置檔案都適合使用單例模式,如HttpApplication 就是單例的典型應用。

  從上述的例子中我們可以總結出適合使用單例模式的場景和優缺點: 

   適用場景: 1.需要生成唯一序列的環境

                       2.需要頻繁例項化然後銷燬的物件。

                       3.建立物件時耗時過多或者耗資源過多,但又經常用到的物件。

                       4.方便資源相互通訊的環境

程式碼實現

#include <iostream>
using namespace std;
/*
a)	建構函式私有化
b)	提供一個全域性的靜態方法(全域性訪問點)
c)	在類中定義一個靜態指標,指向本類的變數的靜態變數指標
*/

class Singelton
{
private:
	Singelton()
	{
		cout << "Singelton 建構函式" << endl;
	}

public:
	static Singelton *getInstance()
	{
		if (p_Singel == NULL)
		{
			p_Singel = new Singelton;
		}
		return p_Singel;
	}

	static void freeInstance()
	{
		if (p_Singel != NULL)
		{
			delete p_Singel;
			p_Singel = NULL;
		}
	}

private:
	static Singelton *p_Singel;
};

Singelton * Singelton::p_Singel = NULL;   //靜態資料成員在類外初始化