Следующая диаграмма классов - это упрощенная версия проекта, над которым я работаю.
Класс A отвечает за сериализацию / десериализацию графа объектов с корнями вC. Я использую фреймворк Csharp для сериализации, поэтому, когда я десериализирую класс C, фреймворк создает новый экземпляр всего в объектах с корнем в C (это показано на диаграмме * новыми классами).Теперь я хотел бы заменить экземпляр C на C на Cnew, но проблема в том, что B1 и B2 по-прежнему указывают на старые D1 и D2.Было бы неплохо не повторять инициализацию зависимостей B2 и B2.
Я ищу способ, чтобы B1 и B2 могли иметь доступ к D1 и D2 через A, не предоставляя им доступ к C или друг другу.,Для простоты мы можем предположить, что все члены A должны быть публичными (он реализует интерфейс из используемой мной платформы, которая заставляет многих членов быть публичными).
Вот некоторые потенциальные решения, которые яхотя из:
Просто прикусить пулю и заново инициализировать B1 и B2
Дайте B1 и B2 ссылки на A вместо D1 и D2 ипросто игнорируйте тот факт, что это дает им доступ ко многим классам, к которым им не нужен доступ.
Вместо того, чтобы давать классам B прямой доступ к классам D, имейте проход Aделегаты (указатели на функции) для функций, которые возвращают экземпляр A для D1 и D2.
имеют интерфейсы A, например D1Container и D2Container, которые имеют 1 обязательный метод, который возвращает экземпляр в D1 или D2.Затем приведите A к D1Container или D2Container и передайте его B1 и B2.
Есть ли шаблон проектирования для такого рода вещей или одно из моих решений однозначно лучше?
Спасибо!