2011-03-29 80 views
5

我正在編寫從字符串映射構建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設計模式嗎?

回答

1

使用製造商/製造商只有在建設用戶配置複雜

如果只想重寫從地圖數據,在用戶配置領域,你必須在用戶配置許多領域,也許更好的解決方案將是例如:反射和映射:Map中的鍵 - > UserProfile中的setter方法

+0

感謝您的反饋。 UserProfile的構造可能很複雜,類映射的時間很長。以上也是一個簡化,Map中的一些條目可以是更多的地圖。是否有API允許我按照你的建議自動將值映射到bean? – 2011-03-30 09:28:45

+0

我不熟悉JAXB,xtreme和castor,只要將XML映射到Java類 – smas 2011-03-30 09:43:34

+0

就可以了。不幸的是,我用來檢索用戶配置文件數據的服務返回的是Map,而不是XML。 – 2011-03-30 10:43:30

2

這變得比建造者更多的訪客。你可以這樣做:

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

爲什麼你認爲這是Visitor的用例?我在這裏看不到'UserProfile'或'Visitor'層次結構。 – 2011-03-29 23:36:35

相關問題