Как мне реализовать динамический список строителей? - PullRequest
5 голосов
/ 29 марта 2011

Я пишу код, который создает объект UserProfile из Map of Strings. В данный момент я делю код на несколько Builder объектов, которые создают части профиля пользователя, что-то вроде этого:

public UserProfile getUserProfile(int id) {
  Map<String, String> data = this.service.getUserProfileData(int id);
  UserProfile profile = userProfileBuilder.build(data);
  profile.setMarketingPreferences( marketingPreferencesBuilder.build(data) );
  profile.setAddress( addressBuilder.build(data) );

  ...

  return profile;
}

Было бы неплохо иметь вместо этого список объектов-строителей, чтобы я мог динамически добавлять дополнительных строителей, не касаясь класса и не нарушая OCP .

Возможно, что-то вроде этого, вместо:

private List<ProfileBuilder> builders;

public void buildBuilders() {
  this.builders = new ArrayList<ProfileBuilder>();
  builders.add( new BasicDetailsBuilder() );
  builders.add( new AddressBuilder() );
  builders.add( new MarkettingPreferencesBuilder() );

  ...

}

public UserProfile getUserProfile(int id) {
  Map<String, String> data = this.service.getUserProfileData(int id);
  UserProfile profile = new UserProfile();
  for(ProfileBuilder builder : this.builders) {
    builder.build( profile, data );
  }

  return profile;
}

Можете ли вы увидеть какие-либо проблемы с этим подходом? Это строго шаблон проектирования Builder?

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Это становится больше посетителем, чем строителем.Вы можете сделать это:

interface UserProfileVisitor {
  public void visit(UserProfile profile, Map<String, String> data);
}
1 голос
/ 29 марта 2011

Использовать builder / builders, только если сложный UserProfile сложен

Если вы хотите переписать данные только из Map в поля в UserProfile и у вас есть много полей в UserProfile, возможно, лучшим решением будет что-то вроде: отражение и отображение: ключ из Map -> метод setter в UserProfile

...