2011-05-03 61 views
1

我有一個簡單的類ExcelStringBuilder。它用於構建可以導出到Excel的字符串。現在我需要建立一個CSV字符串。我應該在這裏使用工廠

我看到實現這兩個類的唯一區別是構建字符串時要使用的分隔符。對於Excel,它將是「\ t」製表符,CSV是其「,」逗號。

我認爲是將分隔符作爲參數傳遞給ExcelStringBuilder類構造函數。這是一個正確的決定,還是應該去工廠模式?

回答

3

不要過度設計它。我只想重構現有類略:

  • 它重命名爲類似ExportStringBuilder
  • 通過分隔符在構造函數中,或作爲ToString()函數的參數

你知道有是一些偉大的免費圖書館可用於此,是嗎?例如。看到this question

1

如果只有區別是分隔符,我只是通過該分隔符。其他一切都是矯枉過正。

如果有更多的差異,我會創建一個StringBuilderFactory,返回IStringBuilderExcelStringBuilderCsvStringBuilder都會實現該接口。您可以將參數傳遞給工廠,告訴工廠您是否需要Excel字符串構建器或CSV字符串構建器,並返回正確的參數。

1

如果你打算使用一個工廠,可以用工廠或獨立沿着使用的模板圖案。由於算法的大部分將只是一個步驟保持相同,並且在未來你可能有額外的步驟,以及(如新的分隔符)

下面是使用模板模式的一種方法。您可以使用「消氣」代替GetDelimiter()。

class abstract StringBuilder 
{ 
    public virtual string GetDelimiter(); 
    public string BuildString(string inputString) 
    { 
    // Your Code goes here... 
    GetDelimiter(); // Code to introduce the delimiter 
    // Some more of your code 
    } 
} 

class ExcelStringBuilder : StringBuilder 
{ 
public override string GetDelimiter() 
{ 
    return "\t"; 
} 
} 

class CsvStringBuilder : StringBuilder 
{ 
public override string GetDelimiter() 
{ 
    return ","; 
} 
} 
+1

但你仍然需要工廠模式來創建適當的類權利? – gordanvij 2011-05-03 09:06:58

+0

@gordanvij,你是對的。那就是我在第一個聲明中提到的。您可以使用模板模式和工廠模式,也可以獨立使用。這樣做的好處是你避免傳遞參數。既然你知道的要求好,你應該接電話:) – 2011-05-03 09:08:48