2011-04-07 50 views
11

什麼因素影響合適的設計模式?單身和靜態實用程序類

澄清:

我之所以問這個問題,是因爲我設計需要多個靜態工廠類和單管理類的應用程序。有時,我變得困惑,其設計我應該的員工,我想提出這個社區爲什麼可能有助於澄清事情對我來說一點。

+0

這非常模糊...... – 2011-04-07 14:45:41

+0

均等化,儘管您可能希望在不久的將來對您的問題進行更具描述性的描述。 :-) – 2011-04-07 14:49:41

+0

我想這是什麼stackoverflow人們認爲脫離主題。如果你表達你的問題的動機並展示一些真實的例子,那麼答案可能更集中。否則,這可能是一個過於寬泛和主觀的問題。 – 2011-04-07 14:50:31

回答

6

我使用的靜態工具類爲共享函數,將從許多不同的上下文中調用 - 數學函數類似於java.util.Math中的函數。假設這些是「純」功能(即不操作任何狀態或訪問除給定參數以外的任何數據),這是一個合適的模式。

我很少使用的單身人士,特別是儘量避免全局單。他們患有與全局變量相關的所有常見問題。他們使測試變得困難,除非你的單身也不可變,否則他們會引入全局狀態的問題。遍歷序列時,你可以測試是否(對象== END_OF_SEQUENCE_MARKER)

public static final END_OF_SEQUENCE_MARKER=new EndMarker(); 

然後:比如 - 我發現它們非常有用的主要場所是依賴於對象標識性能黑客。因爲它是一個靜態的最終參考,JIT將把它變成一個非常快速的測試....

編輯

已經剛剛看到你的澄清,一些快速的額外評論:

  • 靜態工廠類通常不會意義。工廠類的要點是可以實例化它(或子類!),對工廠對象進行一些配置更改,然後根據您需要的配置使用它來生成對象實例。如果你打算使它成爲靜態的,你可能只需創建一個靜態的MyObject.create(..)方法,而不是一個完整的靜態MyObjectFactory類......
  • 同樣,爲什麼有一個單獨的單例管理器類?通常,管理單例的最好的類是單例類本身,因爲您通常需要它來訪問私有構造函數,假設您要保證只創建一個實例。只要有一個簡單的靜態MySingleton.getInstance()方法通常會做你需要的一切。
13

辛格爾頓時使用一個單一的對象需要被實例化,並且所有請求對象的訪問經歷此特定實例。如果需要,該對象可以保持狀態。當你有一類就是剛無國籍實用功能..它不維護狀態

靜態工具被使用。該對象的一個​​實例從未實例化。

+0

你是什麼意思,班級維護一個國家(什麼狀態)? – Mercury 2016-12-28 16:35:34

1

我不確定這裏的問題是什麼。

辛格爾頓模式被用在該實例具有可以保留或跨呼叫的數量改變狀態 - 這可能是一個連接池或其他一些共享對象的類提供了訪問。

靜態工具類用於其中每個單獨的方法是無狀態的,並且對所述類提供了其它方法沒有關係。

2

IMO靜態工具類粉筆下來電者和班級之間的具體合同。這與單身人士不同,您可以在幕後更改實施方案,以便每次撥打電話getInstance時,讓所謂的「單身人士」提供者發出新實例。

所以是的,基本上使用靜態工具方法,當你確定(例如Math)你永遠不需要一個實例,並且當你認爲單個實例足夠好,但可能會改變未來(例如連接提供商)。