2009-04-27 249 views
1

我做了很多「設計自己的____」應用程序。
我做的是我做一個單例類來保存用戶選擇的所有自定義。例如:當你選擇你想要的東西是綠色的,它會更新一個getton/setter在單例中是綠色的。然後,當應用程序需要知道選擇了什麼顏色時,它會從同一個getter/setter獲取信息。
我用來做到這一點的方式是將信息存儲在UI中(只需檢查從下拉菜單中選擇了什麼顏色)。
在閱讀了關於MVC(我還沒有完全理解MVC)之後,我現在知道這是完全錯誤的,這就是爲什麼我將它抽象爲包含所有這些的單例類。這是Singleton模式的一個很好的用法嗎?

現在我想知道這是不是一個壞主意?如果是的話,我應該怎麼做呢?

謝謝。

+0

試圖分開你的問題描述了一下,所以我可以嘗試包圍我的頭。 – 2009-04-27 14:30:38

+1

更多單身東西 - http://stackoverflow.com/questions/726685/yeah-i-know-im-a-simpleton-so-whats-a-singleton – madcolor 2009-04-27 15:17:35

回答

5

我會說這不是真正的Singleton模式的目的。這是一種非常被誤解的模式,人們使用它的最常見的原因似乎是它很容易訪問,因爲它們通常是靜態的。真正發生的情況是,你有一個配置問題,你試圖通過一個靜態單例來解決,該單例可以很容易地在整個應用程序中訪問。當試圖控制對真正有限的資源的訪問時,「正確的」使用會是。

如果您認爲對應用程序只有一個通用「配置」可能確實沒有意義。它有更多的意義,有幾個,但也許只有一個曾經在同一時間使用。

-Edit- 而不是使用可以靜態訪問的單例,可以考慮使用依賴注入或控制反轉。

0

我是一個Service Layer傢伙(雖然我有我自己的服務層願景),會推薦做一些IoC並將所有定製邏輯移動到單獨的服務(AmbienceService或其他)。因此,在你的演講,你會做(C#風格的僞代碼):

viewModel.HeaderColor = ServiceLocator.Resolve<AmbienceService>().HeaderColor; 
0

我不能完全確定你的問題,但這裏是什麼什麼,我做的吧。

您的應用程序逼搶後有一個用戶界面,允許用戶選擇一堆參數(例如下拉一組顏色。其中之一是綠色。)

後來(例如應用程序並重新啓動它)所選的值需要再次加載。

如果這是你的具體問題,我真的不認爲這與單身模式本身有什麼關係。我想你想要的是一個配置文件(應用程序的app.config和Web應用程序的web.config)。 使用ConfiguratoinManager類,您可以輕鬆訪問這些類。

3

單身人士通過設計將實例數量限制爲一個。在你的情況下,你爲什麼決定你必須只有一個實例?如果你想要多種配置呢?您的設計無法實現多個代表不同配置的實例。

1

我假設你正在談論的東西像car configurator - 選擇油漆,引擎,輪輞和所有其他的東西。

在這種情況下,我不會使用單身。不是因爲它不起作用,而是因爲它看起來語義上是錯誤的。單身意味着只有一種狀態。但是你的應用程序可能有兩個窗口 - 就像兩個文件。對於單身人士,你不能獨立修改兩個文件,因爲他們共享他們的狀態。所以你看,它真的不應該是一個單身人士。

0

您的問題的答案可能與您當前的環境有很大關係。例如,在Java運行時屬性通過System.getProperties等提供.Windows有其註冊表。

你有沒有想過使用上下文來傳輸狀態的解決方案?你真的需要全球性?你的屬性可以在運行時改變嗎?你會有多個線程可能修改相同的屬性嗎?這些都是設計中需要考慮的一切。

就個人而言,我通常只是選擇任何似乎是我工作環境的約定。從你最後一個問題來看,這聽起來像你正在使用ActionScript,是否有一個已經存在的約定?

0

這不是你應該使用的模式。我認爲你應該嘗試一種狀態模式。當您需要訪問來自許多不同地方的有限資源時,Singleton適用。

就像打開和讀取配置文件一樣。而不是閱讀同一個文件的不同類,他們通過一個只做這個的類。您需要的是,當用戶更改設置時,需要通知系統已更改某些內容。

但這真的取決於您使用的語言。據我所知,只有java有一個onNotify()方法。但我可能是錯的。

2

請記住,一個單例基本上是一個全局變量,並具有所有相同的問題。例如:

  • 每個類都可能依賴於單例(以及單例本身依賴的任何東西)。但是這種依賴並不是通過你傳遞的值來明確的,所以不可能檢測到。
  • 由於您可以從程序中的任何位置對其進行編寫,因此每次調用函數時都有可能會更改它。所以你永遠不能完全依靠它的價值。

我知道將一個對象傳遞給需要它的程序的每個部分是一種痛苦。但是這最終會導致更好的設計。

  • 它會迫使你減少依賴於你的數據對象的類的數量。
  • 它會使重構變得更容易,更具可預測性,因爲您可以確信自己的物體不會在背後被改變。
相關問題