ゲームの作成には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)
.....
なぜ私は彼らがシングルトンであると思うのですか?ゲーム内の非常に異なる場所で必要になるため、共有アクセスが非常に便利だからです。言い換えると、どこかでそれらを作成し、すべてのアーキテクチャにポインタを渡すことは非常に難しいので、私はそうしません。また、これらは私が必要とするものの一種です。いずれにせよ、いくつか必要になりますが、マルチトンパターンも使用できます。しかし、最悪の事態は、シングルトンが次の理由で最も批判されているパターンであることです。
- 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個を超えるシングルトンを使用するのが普通です。
私が必要とするこれらのすべてのクラスのインスタンスを持つシングルトンファサードを使用することを考えましたが、それらはそれぞれシングルトンではありません。これにより多くの問題が解消され、Facade自体のシングルトンは1つだけになります。しかし、この場合、別の設計上の問題があります。ファサードは神のオブジェクトになります。これも臭いがすると思う。したがって、この状況に適した設計ソリューションは見つかりません。ご意見をお聞かせください。