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

标签 java design-patterns builder

我正在编写从字符串映射构建 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 设计模式吗?

最佳答案

这更像是一个访客而不是一个构建器。你可以这样做:

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

关于java - 我应该如何实现构建器的动态列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5476375/

相关文章:

java - 如何在不显式使用构造函数的情况下生成不可变的 DTO?

android - 单击持续通知时返回上一个 Activity

java - Java 中使用 Deque 的 pop() 问题

java - 在为用户打印代码之前,java是否会创建所有用于递归的堆栈帧?

java - 如何将此shoutOut Canned Message() 方法放入新类中?

Javascript揭示模块模式的缺点

design-patterns - 忽略(严重)错误以使程序继续运行?

javascript - 在揭示模块模式中使用自执行匿名函数

Delphi/Builder/VCL,重写窗体的WM_PAINT而不丢失双缓冲?

java - SMS Intent 不会仅在 oneplus 手机中填充收件人