設計模式C 描述

2021-12-30 00:50:33 字數 1683 閱讀 1933

一.概念

單例模式:其意圖是保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點,該例項被所有程式模組共享。

[cpp]

class csingleton   

//私有建構函式,防止例項化 

private: 

csingleton(){};   

//私有靜態指標變數,指向類的唯一例項 

private: 

static csingleton * m_pinstance; //宣告乙個靜態成員 

};  

csingleton* csingleton::m_pinstance = null; //定義並初始化靜態資料成員 

int main()   

if (ps1 == ps3) 

if (&ps4 == ps1) 

return 0; 

} 單例模式通過類本身來管理其唯一例項,唯一的例項是類的乙個普通物件,但設計這個類時,讓它只能建立乙個例項並提供對此例項的全域性訪問。

使用者訪問唯一例項的方法只有 getinstance() 成員函式。如果不通過這個函式,任何建立例項的嘗試都將失敗,因為類的建構函式是私有的。

有一點要注意:一定要加上 csingleton* csingleton::m_pinstance = null; 這一句,不然的話編譯會出錯,因為這一句才是變數定義。

二.單例類csingleton 有以下特徵 www.2cto.com

它有乙個指向唯一例項的靜態指標m_pinstance,並且是私有的;

它有乙個公有的函式,可以獲取這個唯一的例項,並且在需要的時候建立該例項;

它的建構函式是私有的,這樣就不能從別處建立該類的例項。

三.存在的問題

1.m_pinstance 指向的空間什麼時候釋放呢?

如果在類的析構行為中有必須的操作,比如關閉檔案,釋放外部資源,那麼上面的**無法實現這個要求。我們需要一種方法,正常的刪除該例項。

不合理的解決方法:

在程式結束時呼叫 getinstance(),並對返回的指標掉用 delete操作。這樣做可以實現功能,但不僅很醜陋,而且容易出錯。因為這樣的附加**很容易被忘記,而且也很難保證在delete之後,沒有**再呼叫 getinstance 函式。也就是說釋放操作由使用者來管理,而不是由類本身來管理,這違背了類的單一職責的原則,這是不合理的。

2. 該例項的析構函式什麼時候執行?

上面的類裡為什麼沒有析構函式,其實即便你加上析構函式也是可以的,但是這個析構函式不會被執行的。因為你的例項是 new 出來的,所以只有 delete 時,才會呼叫析構函式,但是在**呼叫 delete 呢!?這又回到了上面的問題。

一種妥善的方法:

[cpp]

class csingleton   

private: 

csingleton() {}; //建構函式 

}; 區域性靜態物件例項 instance 是第一次呼叫 getinstance() 時被構造,一直保持活動狀態直到應用程式終止,與動態分配物件不同,靜態物件當應用程式終止時被自動銷毀掉,所以就不必再手動銷毀例項了。

當然這裡,可以加上析構函式來處理你想要的操作。

這樣做的要點有以下幾點:

1. 靜態變數在記憶體中只有乙份,從而保證了單例模式中單一例項的要求。

2. 靜態變數在程式終止時會被自動銷毀,從而保證了空間正常釋放。

作者 lwbeyond

設計模式C 描述

一.定義 介面卡模式將乙個類的介面轉換成客戶希望的另外乙個介面,使得原本由於介面不相容而不能一起工作的那些類可以一起工作。adapter 模式的兩種類別 類模式和物件模式。二.舉例說明 實際中,我們為了完成某項工作購買了乙個第三方的庫來加快開發。這個庫可能都是一些.dll檔案,這就帶來了乙個問題!我...

設計模式C 描述

一.概述 在物件導向系統的設計何實現中,建立物件是最為常見的操作。這裡面就有乙個問題 如果乙個應用程式使用了太多的物件,就會造成很大的儲存開銷。特別是對於大量輕量級 細粒度 的物件,比如在文件編輯器的設計過程中,我們如果沒有為字母建立乙個物件的話,系統可能會因為大量的物件而造成儲存開銷的浪費。例如乙...

設計模式 簡介 C 描述

second60 20180424 設計模式,在物件導向設計語言中,是非常重要的思想。無論是架構設計,還是在平常的功能開發,用了設計模式,會如虎添冀。如擴充套件性方面,一些設計模式,新加乙個類繼承原有父類,即可不修改 的情況,支援了新的功能。下面,我會歸納總結下23種設計模式,網上也有很多例子,盡量...