[英]How should I implement a dynamic list of builders?
我正在編寫從字符串映射構建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);
}
僅當構造UserProfile很復雜時才使用構建器/構建器
如果您只想從Map中重寫數據到UserProfile中的字段,並且您在UserProfile中有很多字段,那么更好的解決方案可能是:反射和映射:來自Map的鍵 - > UserProfile中的setter方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.