Пожалуйста, пересмотрите. Вы НЕ хотите использовать синглтоны здесь. Вы делаете некоторые функции доступными для пользователей, которые являются производными от вашего класса. Все в порядке. Но вы также диктуете один конкретный способ, которым он должен использоваться всегда, и абсолютно без причины. Это не хорошо.
Может иметь смысл создавать экземпляр только одного объекта этого класса большую часть времени, но в этом случае просто просто создает экземпляр объекта один раз . Не похоже, что вы случайно создадите десятки объектов, не заметив этого.
Кроме того, как вы можете сказать, что наличие двух экземпляров будет НИКОГДА полезным? Я могу вспомнить несколько случаев даже сейчас.
Модульное тестирование: вы можете захотеть, чтобы каждый тест создавал экземпляр этого объекта, а затем снова разрушал его. А поскольку у большинства людей есть более одного модульного теста, вам нужно будет выполнить его несколько раз.
Или, возможно, в какой-то момент вы решите иметь несколько идентичных / похожих уровней в вашей игре, что означает создание нескольких экземпляров.
Синглтон дает вам две вещи:
- Гарантия того, что будет создан только один экземпляр объекта, и
- Глобальный доступ к этому экземпляру
Если вам не нужны обе эти вещи, есть лучшие альтернативы.
Вам, конечно, не нужен глобальный доступ. (глобальные ошибки плохие и обычно являются признаком плохого дизайна, особенно в изменчивых данных, таких как состояние вашей игры)
Но вам не нужна гарантия того, что будет создано не более одного экземпляра.
Конец света, если я дважды создаю объект? Будет ли сбой приложения? Если это так, вам нужна эта гарантия.
Но в вашем случае ничего плохого не произойдет. Человек, создающий объект, просто использует больше памяти, чем необходимо. Но у него может быть причина.
Просто укажите в документации класса, что это очень большой и дорогой класс, и вы не должны создавать его экземпляры чаще, чем это необходимо. Задача решена. Вы не удаляете гибкость, которая может оказаться полезной позже, вы не предоставляете глобальный доступ к данным без причины. Поскольку вы можете контролировать, кто может видеть объект, вам не нужно утопить его в блокировках, которые станут узким местом в многопоточных приложениях. У вас нет скрытых зависимостей, разбросанных по всему коду, что усложняет тестирование и повторное использование.