Простой подход состоит в том, чтобы просто сделать то, что раньше было Singleton<T>
глобальнымT
. У глобалов тоже есть проблемы, но они не представляют собой кучу дополнительной работы и шаблонного кода для обеспечения тривиального ограничения. Это в основном единственное решение, которое не предполагает (потенциально) касания конструктора сущностей.
Более сложный, но, возможно, лучший подход заключается в передаче ваших зависимостей туда, где они вам нужны . Да, это может включать передачуWindow *
объектов (например, вашей сущности) способом, который выглядит грубым. Тот факт, что он выглядит грубым, должен вам кое-что сказать: ваш дизайн может быть грубым.
Причина, по которой это сложнее (помимо привлечения большего числа типов), заключается в том, что это часто приводит к рефакторингу ваших интерфейсов, так что то, что вам «нужно» передать, требуется меньшему количеству классов конечного уровня. Это делает многие уродства, присущие передаче вашего рендерера всему, исчезает, а также повышает общую удобство сопровождения вашего кода за счет уменьшения количества зависимостей и связности, степень которой вы сделали очень очевидной, принимая зависимости как параметры , Когда зависимости были единичными или глобальными, было менее очевидно, насколько взаимосвязаны ваши системы.
Но это потенциально серьезное начинание. Делать это в системе после факта может быть совершенно больно. Возможно, для вас гораздо более прагматично просто оставить свою систему наедине с одиночкой на данный момент (особенно если вы пытаетесь на самом деле выпустить игру, которая в противном случае работает просто отлично; игрокам, как правило, не будет интересно, если у вас есть). синглтон или четыре там).
Если вы действительно хотите попробовать сделать это с вашим существующим дизайном, вам может потребоваться опубликовать гораздо больше подробностей о вашей текущей реализации, поскольку на самом деле нет общего контрольного списка для внесения этих изменений. Или приходите обсудить это в чате .
Исходя из того, что вы опубликовали, я думаю, что большой шаг в направлении «без единого» будет состоять в том, чтобы избежать необходимости для ваших сущностей иметь доступ к окну или представлению. Это говорит о том, что они рисуют сами, а вам не нужно, чтобы сущности сами рисовали . Вы можете принять методологию, в которой сущности просто содержат информацию, которая позволила бы их нужно рисовать какой-то внешней системой (которая имеет ссылки на окна и представления). Сущность просто выставляет свою позицию и спрайт, который она должна использовать (или какая-то ссылка на указанный спрайт, если вы хотите кэшировать фактические спрайты в самом рендерере, чтобы избежать дублирования экземпляров). Рендереру просто приказывают нарисовать определенный список сущностей, который он просматривает, считывает данные и использует свой внутренний оконный объект для вызова draw
со спрайтом, ищущим сущность.