Предположим есть игра. В игре есть базовый класс Unit, от него наследуются другие персонажи - Mage, Warrior, Paladin, подобных классов много. Проблема в том что нужно где-то хранить ссылки на них, для того чтобы можно было манипулировать списком сразу всех персонажей (установка настроек, рандомный выбор, выбор для игрока, и проч.), а не создавать конкретный. Если хранить список в отдельном static поле, то его каждый раз придётся изменять, когда будет написан ещё один тип, а это как минимум нарушает принцип единой ответственности. Существует ли механизм (или паттерн), который автоматически сохраняет вновь ново созданный тип персонажа в общий список? Как обычно поступают в подобных ситуациях?
По-моему у вас противоречие:
>> где-то хранить ссылки на них
и
>> а не создавать конкретный
Честно говоря, не понятно что вы хотите сделать, и в чём проблема хранить. В рантайме, коде..
1) Руками добавлять новый тип в список
2) Через рефлексию добавлять в словарь все дочерние типы https://stackoverflow.com/questions/857705/get-all...
3) Через конфиг
4) Через IoC добавить несколько реализаций. Вот пример
services.AddSingleton<IService, ServiceA>();
services.AddSingleton<IService, ServiceB>();
services.AddSingleton<IService, ServiceC>();
var myIServices = serviceProvider.GetServices<IService>();