Java中的模式和單例
發布人:syq
時間: 2022-10-09 10:47:44 1665283664
本文針對的是任何第一次遇到設計模式概念的人,他們聽說過這個術語單身人士,或者以某種方式實現了單例模式,但不明白發生了什么。CodeGym學生在15級中第一次遇到設計模式,當時船長出乎意料地要求他們通過延遲實現Java Singleton模式來“加強”他們的理解。學生聽說單身人士模式第一次立即有很多問題:到底什么是設計模式?我們為什么需要它?什么是單身人士?最后,什么是懶惰的實現?讓我們按順序回答這些問題。

到底什么是設計模式?
我相信一點歷史是為了以最好的理解來回答這個問題。有四位著名的編程作家(埃里希·伽馬,約翰·弗利賽德斯,拉爾夫·約翰遜和理查德·赫爾姆)提出了一個有趣的想法。他們注意到軟件開發通常需要他們解決大致相同的問題,并以相同的方式編寫結構的代碼。因此,他們決定描述在面向對象編程中經常需要使用的典型模式。他們的書于1994年出版,標題為“設計模式:可重用面向對象軟件的元素”。這本書的名字太長了,人們開始簡單地稱它為四人幫的書。第一版包括23種圖案。之后,發現了數十種其他模式。因此,讓我們用幾句話來總結這一段問題的答案(到底什么是設計模式):
設計模式是常見問題的標準化解決方案。
和單身人士模式只是其中之一。
為什么我們需要設計模式?
你可以在不知道模式的情況下進行編程:畢竟,到15級時,你已經在CodeGym上編寫了數百個小程序,甚至不知道它們的存在。這表明設計模式是一種工具,其用法將大師與業余愛好者區分開來:設計模式描述了如何正確解決典型問題。這意味著了解模式可以節省您的時間。通過這種方式,它們類似于算法。例如,您可以使用二十一點和數字創建自己的排序算法,并花費大量時間執行此操作,或者您可以實現一個已經理解和描述很長時間的算法。設計模式也是如此。
此外,使用設計模式,代碼變得更加標準,并且在使用適當的模式時,您不太可能犯錯誤,因為模式的常見陷阱很久以前就被識別并消除了。最重要的是,對模式的了解有助于程序員更好地相互理解。你可以簡單地說出一個模式的名稱,而不是試圖向你的程序員同事提供一個冗長的解釋??偠灾?,設計模式可以幫助您:
不是重新發明輪子,而是使用標準解決方案
標準化代碼
標準化術語
在本節的最后,我們注意到整個設計模式可以分為三大組:

最后,單例模式
單身 人士是一種創造模式。此模式確保一個類只有一個實例,并為此對象提供全局訪問點。從描述中可以清楚地看出,此模式應應用于兩種情況:
當程序要求不應創建特定類的一個以上對象時。例如,計算機游戲可能有一個 Hero 類,而只有一個 Hero 對象來描述游戲中唯一的英雄。
當您需要提供對對象的全局訪問點時。換句話說,您需要使對象從程序中的任何位置都可用。唉,僅僅創建一個全局變量是不夠的,因為它沒有寫保護:任何人都可以更改變量的值,因此對象的全局訪問點可能會丟失。a 的這些屬性單身 人士是必需的,例如,當您有一個與數據庫一起使用的對象,并且您需要從程序的不同部分訪問該數據庫時。一個單身 人士將確保沒有人編寫替換以前創建的實例的代碼。
所以單身 人士滿足了這兩個需求:程序中必須只有某種對象中的一個,并且必須全局訪問它。在級別 15 的示例中,船長要求您為以下任務實現此模式:
1.查找具有惰性初始化的單例示例。
2.使用相同的原理在單獨的文件中創建三個單例類(太陽、月亮、地球)。
3.在太陽、月亮和地球類中實現行星接口。
4.在解決方案類的靜態塊中調用讀取鍵從控制臺和初始化行星方法。
5.實現“從”從“”并初始化“方法方法功能:
5.1. 從控制臺讀取一個字符串參數
5.2. 如果參數等于行星接口的常量之一,請創建合適的Planet對象。
仔細閱讀任務條件后,我們可以清楚地看到為什么單身 人士這里需要。實際上,我們被要求創建以下每個類的實例:太陽、月亮、地球,假設我們只應該創造一個太陽/月亮/地球是有道理的。否則,我們就會陷入荒謬的境地,除非你正在寫你的《星球大戰》版本。實現單身 人士Java中的模式三個步驟 在Java中,單例行為不能使用普通的構造函數來實現,因為構造函數總是返回一個新對象。因此,的所有實現單身 人士歸結為隱藏構造函數,創建控制單例對象生存期的公共靜態方法,以及“銷毀”所有新出現的對象。如果單身 人士被訪問,它應該創建一個新對象(如果程序中尚不存在),或者返回一個現有對象。要完成此操作,請執行以下操作:
1.您需要為該類提供一個存儲單個對象的私有靜態字段:

2.將(默認)構造函數設為私有。這意味著無法在類外部訪問它,并且無法返回新對象:

3.聲明一個靜態創建方法,該方法將用于獲取單例:

上面的例子有點笨拙,因為我們只是隱藏了構造函數,提供了我們自己的方法,而不是一個標準的構造函數。由于本文旨在確保 CodeGym 學生接觸到這種模式(以及一般的設計模式),因此這里將不介紹更復雜的單例實現的細微差別。我們只注意到,根據程序的復雜性,此模式可能需要進一步完善。例如,在多線程環境中(請參閱有關線程的文章),多個不同的線程可能會同時訪問單例方法,并且上述代碼將停止工作,因為每個單獨的線程都可以創建類的實例。因此,仍然有幾種不同的方法來創建適當的線程安全單例。但那是另一個故事=)
延遲初始化也稱為延遲初始化。這是一種編程技巧,其中資源密集型操作(并且創建對象是資源密集型操作)是按需執行的,而不是提前執行的。那么在我們的單身人士Java代碼?換句話說,我們的對象是在訪問它的時候創建的,而不是提前創建的。你不應該假設懶惰的初始化以某種方式與單身 人士模式。惰性初始化也用于其他創建設計模式,例如代理和工廠方法,但這也是另一個故事=)
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。