單例模式與靜態變數的區別

2021-07-23 04:01:54 字數 867 閱讀 4336

單例的特點:

保證某類只存在唯一例項。

該類本身完成自身的初始化。

獲取該唯一例項的方式非常明確,可以通過該類本身定義的靜態方法getinstance()獲取該類的唯一例項引用。

靜態變數定義某類的例項引用特點:

該類的例項引用的靜態變數可定義在任何文件類當中。

獲取該類的例項引用的靜態變數,可以通過定義該靜態變數的類名通過點語法進行訪問該引用。

任何位置可以對該靜態變數進行重新賦值。

通過這兩者方式的特點,我們可以很明顯的看出兩者之間的區別。(這一切都是基於某類只需要存在乙個例項物件的前提來討論)

首先靜態變數方式不能確保某類的例項的唯一性,這樣在專案中,可能因為在某個文件類中對該靜態變數進行再次賦值,存不可意料的風險(這種風險可以規避)。同樣的,因為靜態變數的定義的位置不確定,所以需要協議商定,這些靜態變數分類別進行定義在乙個固定的位置(比如說某個專門存放靜態變數方式的某類的物件的引用的文件類當中)。

而單例模式也就是靜態變數方式建立乙個類的例項引用所帶來的缺陷的改善。首先解決引用的唯一例項可能被重新賦值的問題,單例模式中的getinstance()靜態方法實現時,採用懶漢式建立乙個物件(當然這只是建立方式的一種),規避了這一風險,無則建立,有則跳過建立。其次,getinstance()靜態方法定義在該類的內部,獲取該類物件的引用位置非常明確,無需額外的溝通商定,團隊成員拿起即用。最後乙個區別並不是很明顯,宣告乙個靜態變數,實際上,我們會直接對其進行初始化賦值,這樣,在記憶體占用上,所占用的記憶體為該初始化賦值物件實際的記憶體。而單例模式可以通過懶漢建立法延遲該記憶體的占用,要知道,當乙個靜態變數只進行宣告,而不進行初始化時,實際的記憶體占用只有4個位元組

參考:單例與靜態變數

單例模式與靜態變數的區別

單例的特點 1 保證某類只存在唯一例項。2 該類本身完成自身的初始化。3 獲取該唯一例項的方式非常明確,可以通過該類本身定義的靜態方法getinstance 獲取該類的唯一例項引用。靜態變數定義某類的例項引用特點 1 該類的例項引用的靜態變數可定義在任何文件類當中。2 獲取該類的例項引用的靜態變數,...

靜態變數與非靜態變數之間的區別

學習ios時候經常遇到有static修飾的變數和沒有static的變數,在ios中主要用到 它們之間的區別是 如 static nsstring identify identify 與nsstring identify identify 1 作用範圍不一樣,有static修飾的identity的內容...

靜態變數 非靜態變數的區別

c 變數根據定義位置的不同,具有不同的作用域,作用域可分為6種 全域性作用域,區域性作用域,語句作用域,類作用域,命名作用域和檔案作用域。從作用域看 全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包括全域性變數定義的原始檔需要用extern關鍵字...