Работа с контейнером для каждого класса является наиболее прозрачным решением.Проще всего это сделать, если все классы наследуются от базового класса, но могут помешать другим вещам, которые вы хотите сделать с наследованием.Но не должно быть такого большого количества кода, поэтому дублирование его для каждого класса не должно быть большой проблемой, и несколько статических методов где-нибудь могут избавиться почти от всего этого.
Однако , Я думаю, что лучшим решением было бы добавить в интерфейс пару методов: активировать (или, может быть, инициализировать) и деактивировать (утилизировать?).Методы класса, реализующие Activate и Deactivate, могут работать, как описано выше, или вызывать контейнерную службу, как вам угодно.
Вы должны помнить, чтобы вызывать эти методы, но они дают вам большую мощность.Они могут обрабатывать другие инициализации, которые могут не работать в конструкторе.Они позволяют отдельным объектам отказаться от вашего контейнера, если вы обнаружите, что некоторые объекты не должны быть там.Это также позволяет ему выбирать другие контейнеры, которые вы можете использовать в будущем.Короче говоря, объекту любого класса предоставляется большая свобода для управления своим бизнесом в структуре программы, и программа может создавать и управлять множеством сложных объектов совершенно разных классов с помощью нескольких простых вызовов методов.