我刚开始使用单身,我只想评估我是否正确使用它。我读过单身人士是邪恶的。我只是从游戏dev't开始,所以像单元测试和多线程这样的东西还没有到达我。
我将游戏的逻辑分成了不同的模块。每个模块都有单例和非单例类(例如数据模型)。我使用单例作为中介,因此它可以与其他模块交互。这允许我与其他人一起工作,因为它是可管理的部分,我只需要暴露我的单身人员的帮助方法。他不需要知道我是如何实现它的。
我做对了吗?
示例:
在传统的日本SRPG游戏(如FFTactics)中,tilemap的单元格/网格有自己的模块。角色与此模块的单身人士互动。
我的所有精灵都是由AssetManager(单身人士)生成的,它会根据设备的分辨率 - 可用性和分辨率自动调整精灵。这只需通过调用单例中的方法来完成。
答案 0 :(得分:1)
我绝对不同意单身人士是邪恶的。它们有时可能被过度使用,但在某些情况下它们对于工作来说是完美的。在某些应用程序中,拥有某种通用数据管理器是有意义的。单例模式广泛用于SDK本身(应用程序委托,共享管理器,默认中心等)。大多数情况下,这些不是“纯粹的”单例,因为您可以访问共享实例,但如果需要也可以创建新实例。
您需要问自己的问题是,在任何时间从任何地方访问数据管理器的单个实例是否有用,如果不是,则可能不需要单个实例。如果你打算在多线程环境中使用单例,你需要担心竞争条件(一个线程可以修改资源而另一个访问它),文档对如何在Cocoa中实现这一目标有很好的解释。
答案 1 :(得分:0)
您也可以使用实例轻松完成此操作。
假设您有一个GameMap
班级和一个Tile
班级。 GameMap
表示Tile
个对象的二维网格。 (这是您的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];
总之,创建一个具有代码来管理其他事物实例的类的实例。保持尽可能全局化,您的代码将更具可扩展性和可维护性。