2010-03-08 125 views
2

我正在使用MVC設計模式創建一個簡單的應用程序,其中我的模型從Web訪問數據並使其可供我的控制器進行後續顯示。MVC模型實現?

經過一番研究,我決定一種方法是將我的模型作爲單例實現,以便我可以將其作爲來自任何控制器的共享實例進行訪問。

說了這麼多,我讀到的關於單身人士的信息越多,我注意到有人說有幾種情況下沒有更好的解決方案。

如果我不使用單身人士,我很困惑我在哪裏可以創建我的模型類。我不太樂意通過appDelegate來完成它,並且將它放在任何viewControllers中似乎都不可行。

任何意見或指針將不勝感激。

EDIT_001:

TechZen,非常感謝(夢幻般的回答總是)我可以使它接受前加一個進一步有點問題。當應用程序退出時,您如何解除分配單身人士的想法如何?我不確定這是多麼重要,因爲我經常知道對象釋放不會在應用程序拆卸時被調用,因爲當應用程序退出時它們將被清除。顯然我可以使用NSApplicationWillTerminateNotification註冊共享實例,這是否值得做,只是好奇?

加里

+0

我想我找到了答案EDIT_001:「單身的目標C通常意,直到內存是由OS進程終止時回收從實例化生活」,因此將迎來答案接受。再次感謝。 – fuzzygoat 2010-03-08 15:56:44

回答

8

有很多推回到了單身的使用,因爲他們經常被濫用。懶惰的編碼器(1)在單例中沒有提供足夠的功能,導致邏輯在其他對象(如意大利麪條)中散佈,或者(2)他們投入了很多功能,使得單例變成了整個程序。懶惰的編碼器經常使用單例,而不是進行數據驗證,對象測試和對象跟蹤。人們厭倦了試圖解開和保持懶惰的單身人士使用,所以他們試圖壓制單身人士的使用。

我完全理解衝動,而我自己在儀式上警告反對單身人士的虐待。

但是,數據模型是單身人士少數合法用途之一。對於那些在手機上運行的小應用程序尤其如此。最後,您將爲數據模型使用單例,或者將其附加到單例。

例如,假設您決定將您的非單例數據模型對象放在應用程序委託中。那麼,你已經這樣做了:dataModel - > appDelegate - > application(singleton)。要訪問它,你會叫:

[[[UIApplication sharedApplication (a singleton)] delegate] theDataModelObj]; 

即使你通過它周圍像從對象令牌對象,你仍然必須有數據模型OBJ開始作爲一個單獨的屬性。

當一個對象真的必須滿足「漢蘭達」模式(「只能有一個!」)時,單身是最好的選擇。除了應用程序對象之外,您還將用戶默認設置爲單例以及文件管理器。顯然,在所有這三種情況下,您都希望整個應用程序只有一個實例存在。例如,如果您有多個用戶默認對象,那麼您的應用程序將成爲試圖追蹤所有首選項設置的列車殘骸。如果您有多個文件管理器,則文件操作可能會互相踩在一起。

正確設計的用戶數據模型僅僅是一個更大的用戶默認值的版本。它應該是直接操縱用戶數據的唯一對象。應用程序中沒有其他對象應該至少具有該任務。這使得單例設計模式成爲這種特殊情況下最好的模式。

單身是一個非常強大的工具,但就如同一個物理的工具,他們給你更多的權力,他們創造了更多的機會讓你砍你的頭掉,如果你不小心使用它們。出於這個原因,單身人士應該很少成爲你的首選。通常使用更好的設計模式。

但是,當你真的需要一個單身,你不應該使用它們只是因爲其他人的懶惰給了他們一個壞名聲避而遠之。

知道什麼時候,當不使用一個強大的和危險的工具是直覺,你有經驗的開發程序員的一部分。你不能通過公式。這是使得良好的編碼成爲藝術和程序員成爲工匠的因素之一。