單例與采用靜態變量引用一個對象的區別


單例的特點:

1.      保證某類只存在唯一實例。

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

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

靜態變量定義某類的實例引用特點:

1.   該類的實例引用的靜態變量可定義在任何文檔類當中。

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

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

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

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

而單例模式也就是靜態變量方式創建一個類的實例引用所帶來的缺陷的改善。首先解決引用的唯一實例可能被重新賦值的問題,單例模式中的getInstance()靜態方法實現時,采用懶漢式創建一個對象(當然這只是創建方式的一種),規避了這一風險,無則創建,有則跳過創建。其次,getInstance()靜態方法定義在該類的內部,獲取該類對象的引用位置非常明確,無需額外的溝通商定,團隊成員拿起即用。最后一個區別並不是很明顯,聲明一個靜態變量,實際上,我們會直接對其進行初始化賦值,這樣,在內存占用上,所占用的內存為該初始化賦值對象實際的內存。而單例模式可以通過懶漢創建法延遲該內存的占用,要知道,當一個靜態變量只進行聲明,而不進行初始化時,實際的內存占用只有4個字節(筆者個人推測,這四個字節只是一個指針地址所占用的內存空間)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM