我使用cocos2d-x游戏引擎来创建游戏。引擎已经使用了很多单例。如果有人使用过,那么他们应该熟悉其中的一些:
Director
SimpleAudioEngine
SpriteFrameCache
TextureCache
EventDispatcher (was)
ArmatureDataManager
FileUtils
UserDefault
还有更多内容,总共约16个课程。您可以在此页面上找到类似的列表:Cocos2d-html5 v3.0中的单例对象但是当我要编写游戏时,我需要更多单例:
PlayerData (score, lives, ...)
PlayerProgress (passed levels, stars)
LevelData (parameters per levels and level packs)
SocialConnection (Facebook and Twitter login, share, friend list, ...)
GameData (you may obtain some data from server to configure the game)
IAP (for in purchases)
Ads (for showing ads)
Analytics (for collecting some analytics)
EntityComponentSystemManager (mananges entity creation and manipulation)
Box2dManager (manages the physics world)
.....
为什么我认为它们应该是单例?因为在游戏中我需要在非常不同的位置使用它们,所以共享访问将非常方便。换句话说,我不是要在某个地方创建它们并将指针传递到我的所有体系结构,因为这将非常困难。这些都是我只需要的东西。无论如何,我都需要几个,我也可以使用Multiton模式。但是最糟糕的是,Singleton是最受批评的模式,原因是:
- bad testability
- no inheritance available
- no lifetime control
- no explicit dependency chain
- global access (the same as global variables, actually)
- ....
您可以在这里找到一些想法:https : //stackoverflow.com/questions/137975/what-is-so-bad-about-singletons和https://stackoverflow.com/questions/4074154/when-should-the-singleton除了显而易见的之外还没有使用的模式
因此,我认为我做错了事。我认为我的代码有异味。:)我比较伤心的是,如何有更多经验丰富的游戏开发人员解决此体系结构问题?我想检查一下,也许在游戏开发中拥有30个以上的singleton仍然是正常的,考虑到那些已经在游戏引擎中。
我曾经考虑过使用Singleton-Facade,它将具有我需要的所有这些类的实例,但是它们中的每一个都不会是singletons。这将消除很多问题,而我只有一个单例,即Facade本身。但是在这种情况下,我将遇到另一个设计问题。立面将成为神的对象。我想这也闻起来。因此,我找不到适合这种情况的好的设计解决方案。请指教。