2012-01-08 344 views
23

可能重複:
Who needs singletons?最佳實踐

我一直對於寫最佳實踐,但我也想知道爲什麼給定的是一個最佳實踐。我已經閱讀了一篇文章(我不幸忘記了),單例類最好是實例化的,而不是用靜態函數製作,並且使用範圍解析運算符(:)進行訪問。所以,如果我有一個包含我所有的工具來驗證類,簡稱:

class validate { 
    private function __construct(){} 
    public static function email($input){ 
     return true; 
    } 
} 

有人告訴我,這被認爲是不好的做法(或至少對警告),因爲這樣的事情作爲垃圾收集器和維護。那麼對於「單例類作爲靜態方法」的批評所要做的是,我實例化一個類,我100%確定我只會實例化一次。對我來說,這似乎是在做「雙重工作」,因爲它已經準備就緒。我錯過了什麼?

關於此事的觀點是什麼?當然,這不是一個生死攸關的問題,但是,如果選項是有的話,也可以做正確的事情:)

+1

[誰需要單身?](http://stackoverflow.com/a/4596323/208809) – Gordon 2012-01-08 11:28:45

回答

51
+1

感謝您的鏈接;已經閱讀過它們。我想我可能會誤解一個單身人士是什麼(這在下面的回覆中已經指出) – 2012-01-08 10:56:12

+0

@MarkHünermundJensen認爲閱讀你的問題。 Tats爲什麼張貼鏈接;)。 – ThinkingMonkey 2012-01-08 11:04:23

+1

請注意依賴注入不等於依賴注入容器。 DI絕對是一件好事; DIC是實現這一目標的一種方式,並不一定是一種通用的解決方案(儘管目前在PHP世界中它非常「流行」)。服務定位器或類似模式也可能是打破依賴關係的可接受方式。 – liquorvicar 2012-01-08 11:17:06

2

那麼,這實際上並不是一個單身人士;一個單例確保你只有一個類的單個實例,並且這裏沒有方法可以檢索單個Validate實例。這裏的設計似乎是一個靜態類。這不會導致垃圾收集器出現問題(至少是你放在這裏的代碼),因爲無論如何它都會被加載到內存中。

+0

這可能會解釋爲什麼我無法找到邏輯,因爲這種類將是一個問題。所以單身人士並不是說只有一次實例化的類,但該方法 - 也只能被調用一次? – 2012-01-08 10:57:19

5

一個Singleton對象是僅實例化一次一個對象。這是不一樣的Singleton Pattern,這是一個(反)模式如何寫一個類,可以只實例化一次,辛格爾頓(大小號開頭):

「確保一個類只有一個實例,並提供一個全局訪問點。「

就PHP而言,你通常不需要實現Singleton模式。其實你應該避免這樣做,當你要求最佳實踐,因爲它是不好的做法

此外,您發現大多數PHP代碼示例都是模式的半準備實現,忽略了PHP的工作方式。這些虛假實現不符合模式中的「確保」。

這也告訴了一些事情:通常這是不需要的。如果一個草率的實現已經完成了工作,而沒有接近該模式的用途,那麼錯誤的模式已經被用於這種情況,它開始成爲反模式的

在PHP中,通常不需要確保一個類只有一個實例,PHP應用程序並不那麼複雜,您可能需要它(例如,沒有多個線程可能需要引用一個原子實例)。

通常留下的是類實例的全局訪問點,這是大多數PHP開發人員(錯誤)使用該模式的原因。正如今天所知,使用這種「單身人士」會導致全局靜態狀態的標準問題,從而在多個級別中將代碼複雜化,並降低可重用性。作爲程序員,您無法靈活地使用代碼。但靈活性是解決問題的一項非常重要的技術。程序員整天都在解決問題。

因此,在應用設計模式之前,需要評估正反兩面。最經常使用某種模式是沒有用的。對於初學者,我會說,只需編寫你的類,並注意它們在應用程序邏輯的某些其他部分如何以及何時被實例化,這樣就保持了靈活性。

+0

很好的答案 - 謝謝:) – 2012-01-08 12:40:06

+3

你的第一句話是矛盾的:)。 -1。對於「PHP應用程序並不那麼複雜」也是-1。您可以使用任何語言編寫複雜的軟件。設計模式與軟件體系結構相關,而與下層技術相關。我會triplle downvote,但我不能。 :) – 2014-01-26 08:54:29

+0

@Geo C.我寫這樣一個理由的一個原因是,PHP應用程序通常不需要跨越進程和線程的原子性,這是多*複雜軟件中線程安全單例的一種用例。你或許判斷得太快,因爲你認爲這確實會攻擊某種特定的語言,但事實並非如此。這只是普通的PHP代碼不需要模式的實現。如果你仍然需要它,我甚至會在我的博客上提供這種模式。 – hakre 2014-01-26 10:02:00