Я пишу диспетчер ресурсов, который может выделять уникальные идентификаторы (например, для одинаковых точек привязки буфера OpenGL, поэтому вам не нужно отслеживать используемые им), поэтому, если бы было больше экземпляров менеджера это будет проблемой, потому что каждый должен знать, какие идентификаторы уже используются. Так один из способов заключается в использовании Singleton:Singleton vs static members
class ResourceManager
{
private:
HandleAllocator uniform_binding_points;
...
public:
static ResourceManager& Get()
{
static ResourceManager resource_manager;
return resource_manager;
}
unsigned int AllocateUniformBindingPoint()
{ ... }
...
private:
ResourceManager()
{ }
~ResourceManager()
{ }
}
Или использовать статические члены, так что может быть несколько экземпляров, но каждый экземпляр использует то же самое состояние:
class ResourceManager
{
private:
static HandleAllocator uniform_binding_points;
...
public:
unsigned int AllocateUniformBindingPoint()
{ ... }
...
}
Так что мой вопрос какая разница, и есть ли лучшее решение (учитывая возможность проверки)? Я знаю, что многие люди ненавидят одиночные игры, но, на мой взгляд, единственное различие заключается в том, что вам нужно получить экземпляр Singleton с Get(), который является одним вызовом метода, но вы можете сохранить ссылку, чтобы вы вызывали Get() один раз. Также я прочитал это: http://misko.hevery.com/2008/08/17/singletons-are-pathological-liars/, и мне нужно сказать, что с составом и агрегацией вы можете добиться того же «скрытия зависимости», поэтому не используйте их тоже? ...
Проблемы возникают, если вам нужно реорганизовать вашу архитектуру, потому что больше нет одного экземпляра, но вам нужно больше их. –