我该如何实现动态的构建器列表?

时间:2011-03-29 17:18:18

标签: java design-patterns builder

我正在编写从字符串Map构建UserProfile对象的代码。目前我正在将代码划分为几个构建用户配置文件部分的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 个答案:

答案 0 :(得分:2)

这更像是一个访客,而不是一个建设者。你可以这样做:

interface UserProfileVisitor {
  public void visit(UserProfile profile, Map<String, String> data);
}

答案 1 :(得分:1)

仅在构造UserProfile复杂时使用构建器/构建器

如果你只想要从Map到UserProfile中的字段重写数据,并且你在UserProfile中有很多字段,那么更好的解决方案可能是:反射和映射:来自Map的键 - &gt; UserProfile中的setter方法