Простий підхід - просто зробити те, що раніше було Singleton<T>
глобальнимT
. У глобальних людей теж є проблеми, але вони не представляють собою купу зайвої роботи та кодового коду для забезпечення тривіального обмеження. Це в основному єдине рішення, яке не передбачає (потенційно) дотику до конструктора сутності.
Більш складний, але, можливо, кращий підхід - передати свої залежності там, де вони вам потрібні . Так, це може включати передачу Window *
купі об’єктів (наприклад, вашій особі) таким чином, що вони виглядають грубо. Той факт, що він виглядає валовим, повинен вам щось сказати: ваш дизайн може бути грубим.
Причина, що це складніше (крім залучення більше введення тексту), полягає в тому, що це часто призводить до рефакторингу ваших інтерфейсів, щоб те, що вам потрібно "пройти", потрібно менше класів на рівні листів. Це змушує багато неподобства, властивого передачі рендерінгу усьому, а також покращує загальну ремонтопридатність вашого коду, зменшуючи кількість залежностей та з'єднання, ступінь яких ви зробили дуже очевидними, приймаючи залежності як параметри . Коли залежності були одинаковими чи глобальними, було менш очевидно, наскільки взаємопов'язаними були ваші системи.
Але це потенційно є великим починанням. Зробити це в системі після факту може бути дуже болісно. Для вас може бути набагато прагматичніше просто залишити свою систему в спокої з сингл-кодом (особливо якщо ви намагаєтеся фактично поставити гру, яка в іншому випадку спрацює нормально; гравці, як правило, не піклуються, якщо у вас є сингл або чотири там).
Якщо ви хочете спробувати це зробити з вашим існуючим дизайном, вам може знадобитися опублікувати набагато більше деталей щодо вашої поточної реалізації, оскільки насправді не існує загального контрольного списку для внесення цих змін. Або приходьте обговорити це у чаті .
З огляду на те, що ви опублікували, я думаю, що великим кроком у напрямку "немає одиночки" було б уникнути необхідності у ваших організацій доступу до вікна чи виду. Це говорить про те, що вони малюють самі, і вам не потрібно, щоб вони мали самі малювати . Ви можете прийняти методологію, коли суб'єкти господарювання просто містять інформацію, яка дозволила б їх, щоб їх малювало якась зовнішня система (яка має вікно та перегляд посилань). Суб'єкт просто розкриває свою позицію, і спрайт, який він повинен використовувати (або якесь посилання на згаданий спрайт, якщо ви хочете кешувати фактичні спрайти у самому рендері, щоб уникнути повторюваних екземплярів). Відображувачу просто кажуть скласти певний список сутностей, через який він проходить цикл, зчитує дані з та використовує свій внутрішній об'єкт вікна для виклику draw
спрайтом, який шукає для сутності.