我正在编写从字符串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设计模式吗?
答案 0 :(得分:2)
这更像是一个访客,而不是一个建设者。你可以这样做:
interface UserProfileVisitor {
public void visit(UserProfile profile, Map<String, String> data);
}
答案 1 :(得分:1)
仅在构造UserProfile复杂时使用构建器/构建器
如果你只想要从Map到UserProfile中的字段重写数据,并且你在UserProfile中有很多字段,那么更好的解决方案可能是:反射和映射:来自Map的键 - &gt; UserProfile中的setter方法