Я використовую ігровий движок cocos2d-x для створення ігор. Двигун вже використовує багато однотонних. Якщо хтось ним користувався, то їм слід ознайомитись з деякими з них:
Director
SimpleAudioEngine
SpriteFrameCache
TextureCache
EventDispatcher (was)
ArmatureDataManager
FileUtils
UserDefault
та багато іншого, загалом близько 16 класів. Ви можете знайти подібний список на цій сторінці: Об'єкти Singleton в 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 синглів , які вважаються тими, які вже є в ігровому двигуні.
Я подумав використовувати Singleton-Facade, який матиме екземпляри всіх цих потрібних мені класів, але кожен з них уже не був би однотонним. Це усуне безліч проблем, і у мене був би один сингтон, який би був самим Фасадом. Але в цьому випадку у мене буде ще одна проблема дизайну. Фасад перетвориться на ОБ'ЄКТ БОГУ. Я думаю, що це теж пахне . Тому я не можу знайти хорошого дизайнерського рішення для цієї ситуації. Будь ласка, порадь.