2011-10-05 91 views
0

我剛剛使用單身人士,我只是想評估我是否正確使用它。我讀過那些單身人士是邪惡的。我只從遊戲開發開始,所以像單元測試和多線程這樣的東西還沒有到達我的面前。我是否正確使用Singleton方法? (iOS遊戲dev't)

我把我的遊戲邏輯分成不同的模塊。每個模塊都有單例和非單例類(例如數據模型)。我使用單例作爲中介,以便它可以與其他模塊交互。這使我可以與其他人一起工作,因爲它是可管理的部分,我只需要公開我的單身人士的幫手方法。他不需要知道我是如何實現它的。

我做對了嗎?

實例:

  • 在傳統的日本SRPG遊戲(如FFTactics),對於tilemap的細胞/網格具有其自身的模塊。角色與此模塊的單例交互。

  • 我所有的精靈都是由一個AssetManager(一個singleton)生成的,它根據設備的分辨率 - 可用性和分辨率自動縮放精靈。這是通過在單例中調用一個方法完成的。

+0

將這樣的問題直接發佈到http://gamedev.stackexchange.com/是不是更好? –

+1

對不起。我不知道有一個特定的部分。在學習Objective-C時,我一直與StackOverflow保持聯繫。剛剛開始與Game Dev't。由於有些人已經提供了答案,我將爲未來的問題保存這個想法。謝謝你的聯繫。 – Sylpheed

回答

0

你可以很容易地用一個實例做到這一點。

比方說,你有一個GameMap類和Tile類。 GameMap表示Tile對象的2維網格。 (這是您的FFTactics示例)。

GameMap *gameMap = [[GameMap alloc] init]; 
NSArray *theTiles = gameMap.tiles; 

GameMap的實例擁有瓷磚的網格,並創建了遊戲地圖時創建的瓷磚。沒有單身人士需要。

你可能會說「但我一次只有一個GameMap,有什麼大不了的?」。加載保存的遊戲或加載新的關卡怎麼樣?那麼就變得如此簡單:

// In whatever class object owns the game map 
self.gameMap = [[GameMap alloc] initWithSaveData:saveData]; 

總之,創建一個具有代碼來管理其他事物實例的類的實例。保持儘可能少的全局性,並且您的代碼將更具可擴展性和可維護性。

+0

我認爲像GameMap這樣的實體是非單身人士。我的設計方法是擁有一個可以在需要時輕鬆交換地圖的GameMapManager(單例),加載和卸載地圖等。當然,GameMap仍然包含Tiles,我的示例是在這種情況下分離的瓦片是無用的。單例實例化自己的一組對象......如果需要,可以輕鬆實現更改數據。所以基本上,它只是一個控制器(一個抽象實體)而不是實際的數據。你對這種方法有什麼看法? – Sylpheed

1

我絕對不同意單身人士是邪惡的。它們有時可能被濫用,但在某些情況下,它們只是完美的工作。在某些應用程序中,有一些通用數據管理器是有意義的。單身模式在SDK中廣泛使用(應用代理,共享管理器,默認中心等)。大多數情況下,這些不是「純粹的」單身人士,因爲您可以訪問共享實例,但也可以在必要時創建新實例。

您需要問自己的問題是,從任何地方隨時隨地訪問數據管理器的單個實例是否有用,如果不是,則可能不需要單例。但是,如果您要在多線程環境中使用單例,您需要擔心競爭條件(一個線程可以修改資源,而另一個線程正在訪問資源),該文檔對如何在Cocoa中最好地實現這一點有很好的解釋。

+0

我也認爲他們不是邪惡的。我不使用它作爲全局變量的容器......但是使我的模塊成爲應用程序的全局模塊。對於單元測試,如果我公開一個將接受另一個模塊的實例(來自單例)的屬性,它會工作嗎?即使我現在找不到它的用途,因爲我可以測試自己的模塊而不依賴於其他模塊(使用虛擬數據)。但是當然有一些模塊嚴重依賴於另一模塊。 – Sylpheed

相關問題