Я не знаю деталей ваших требований.Но из того, что я вижу, мое предложение было бы разделить процесс на чистые независимые миры или обязанности:
- идентификация роли (организации)
- создание зависимого от роли документа
- вывод документов
Я думаю, Print(Options)
должен заботиться только об отправке документов на указанный вывод.Print(Options)
должен понимать все документы, но не собирать их.В настоящее время основная проблема заключается в том, что вам приходится вносить изменения во многие места, например, при добавлении новых документов, ролей или других данных документов, поскольку между обязанностями нет четких границ.
Учтите это: в тот самый момент, когда высоздавая или настраивая аргумент параметров для конкретного документа, вы уже знаете, как будет выглядеть документ.Зачем Print(Options)
начинать все заново?В тот момент, когда вы знаете варианты, вы можете создать соответствующий документ.Таким образом, вы уже устранили необходимость в типе Options
и, что более важно, в проверке состояния уродливого и сложного объекта Options
.
Итак, ваш поток начинается с вызова правильного метода, которыйспецифичные для роли.Этот метод создаст документ, который соответствует требованиям этой определенной роли.Так что OptionsCreator
становится DocumentCreator
.
Как только документ создан, вы передаете его в метод печати.Так что Print(Options)
становится Print(Document)
.Важно, чтобы Print(Document)
мог выводить документ, ничего не зная о ролях или деталях документа, а только о том, как и где вывести документ.Теперь, когда вводится новая роль или содержимое документа, Print(Document)
не подлежит изменению.Вы только добавили бы новый фабричный метод в DocumentCreator
, чтобы создать новый документ, специфичный для новой роли.
Не думаю, что вы можете получить пользу от Строителя прямо здесь.