Прежде чем я начну, я хочу пояснить, о чем мы говорим, чтобы мы все были на одной странице. Синглтон это:
- «объект» Это означает, что он имеет определенное внутреннее состояние, которое инкапсулировано из прямого внешнего доступа. У него есть время жизни: оно создается в какой-то момент выполнения программы и уничтожается в более поздний момент.
- «из которых не может быть создано более одного экземпляра». Это означает, что существует некоторый механизм явного , который принудительно предотвращает создание нескольких экземпляров. Конструктор и деструктор будут вызываться не более одного раза при выполнении программы.
- "который доступен по всему миру." Экземпляр, после его создания, доступен либо через глобальный вызов функции, либо через открытый статический член класса.
Глобальный объект не синглтон; это просто глобальный объект. Если возможно сделать больше одного, это не синглтон.
Теперь, когда определения устарели:
VBOManager (Singleton)
Я не могу представить, как этот объект работает каким-либо образом, который имеет смысл. Буферные объекты, с точки зрения OpenGL, являются автономными конструкциями. Они не имеют никакого отношения друг к другу. Поэтому я не понимаю, зачем вам менеджер, который обрабатывает всех из них.
Я могу понять, что у меня есть специализированный класс объектов-буферов для работы с объектами потокового буфера. Есть несколько способов потоковой передачи, и некоторые из них более эффективны, чем другие. Поэтому имеет смысл обернуть это в объект.
Но иметь диспетчер объектов глобального буфера не имеет смысла. Буферные объекты должны быть независимы друг от друга. Или, во всяком случае, они должны зависеть от других объектов, таких как сетки (несколько объектов сетки могут ссылаться на один и тот же буфер (ы)). Но вам не нужно иметь диспетчер объектов глобального буфера.
Я понимаю, что у меня есть хранилище именованных объектов, из которого вы можете добавлять и извлекать. Но я не понимаю, нужно ли это для конкретных типов объектов, как это. И необходимость того, чтобы он был глобальным синглтоном, сомнительна.
Я считаю, что синглтоны лучше всего подходят для концепций, которые принципиально уникальны. Существует одна файловая система, и поэтому имеет смысл иметь глобальную файловую систему. Сам OpenGL является глобальным (из-за его природы на основе C), хотя даже тогда можно переключать контексты рендеринга. Если когда-нибудь имеет смысл иметь две штуки, то, вероятно, не лучший вариант - синглтон.
Даже если вы используете только один буферный объект и у вас есть менеджер для него, нет необходимости делать этот класс одиночным. Вы можете сделать его глобальным, если хотите, но нет необходимости принудительно запрещать пользователям создавать более одного экземпляра этого класса. Если позже вы захотите иметь несколько диспетчеров буферных объектов (и, возможно, заплатите цену производительности), пусть будет так.
GLUtils (синглтон)
Почему это объект ? Паттерн «Синглтон» относится к объекту, в котором может быть только один экземпляр в любой момент времени. Функции утилит являются просто глобальными функциями .
C ++ не является Java. Вам не нужно помещать все в класс. Глобальные функции не плохой дизайн. Действительно, они имеют хороший дизайн, где это уместно. Если функция не нуждается в доступе к какому-либо состоянию (вне ее параметров и любых других функций, которые она может вызвать), то нет необходимости, чтобы она была частью объекта.
Графика (синглтон)
Это то, для чего можно утверждать, что синглтон имеет смысл. Это живой объект с государством. И вам явно не нужно больше одного в вашем приложении.
Однако учтите это. Так ли неправильно иметь более одного? Как часто вы будете проходить вокруг этого Graphics
объекта? Сколько кода нужно для работы на уровне объекта Graphics
? Я думаю, не так много. Какой-то базовый код инициализации и все.
Так что, хотя это оправданно, это не необходимо . Это не концепция, которая требует быть Синглтоном. Кроме того, имея более одного, вы можете удалить его в любое время и создать новый. Это позволяет вашему приложению легче восстанавливать окно.
Единственный недостаток - возможность иметь два Graphics
объекта одновременно. И это включает в себя работу с контекстами OpenGL. Поскольку контекст OpenGL является глобальным состоянием, наличие нескольких Graphics
объектов может вызвать проблемы, поскольку у обоих будет свой собственный контекст. Вам нужно было бы каким-то образом установить конкретный объект Graphics
в качестве текущего, который связывал бы себя в качестве текущего контекста OpenGL (и извлекал все необходимые указатели на функции).