Проблема первых двух подходов, которые вы предложили, заключается в том, что они не являются гибкими.Если впоследствии ваши требования изменятся (скажем, у вас будет больше дочерних объектов, или свойство A будет просто переименовано и т. Д.), Это приведет к изменениям в основном классе или в классе Resource, что не очень хорошо.Более того, с моей точки зрения, эти классы не должны обновлять свойство A.
Лично я бы предложил немного измененный третий подход, поскольку он перемещает всю логику обновления в объект построителя, который являетсяхорошее и гибкое решение.Я бы сказал, что у этого объекта должен быть метод, скажем BuildUp(Request instance)
, и внутри этого метода должно происходить все обновление.То, как вы реализуете фактическое обновление, здесь не имеет значения - все это будет оставлено в стороне в специальном классе, и в случае каких-либо изменений оно может быть изменено в мгновение ока, без изменения основной логики классов приложения..
Кроме того, вы можете создать интерфейс для этого компоновщика и работать с интерфейсом только в коде класса Resource
.Это будет основной класс, который будет знать о фактической реализации используемого компоновщика.Таким образом, в случае каких-либо изменений можно заменить реализацию компоновщика одной строкой.