我有一個簡單的類ExcelStringBuilder。它用於構建可以導出到Excel的字符串。現在我需要建立一個CSV字符串。我應該在這裏使用工廠
我看到實現這兩個類的唯一區別是構建字符串時要使用的分隔符。對於Excel,它將是「\ t」製表符,CSV是其「,」逗號。
我認爲是將分隔符作爲參數傳遞給ExcelStringBuilder類構造函數。這是一個正確的決定,還是應該去工廠模式?
我有一個簡單的類ExcelStringBuilder。它用於構建可以導出到Excel的字符串。現在我需要建立一個CSV字符串。我應該在這裏使用工廠
我看到實現這兩個類的唯一區別是構建字符串時要使用的分隔符。對於Excel,它將是「\ t」製表符,CSV是其「,」逗號。
我認爲是將分隔符作爲參數傳遞給ExcelStringBuilder類構造函數。這是一個正確的決定,還是應該去工廠模式?
不要過度設計它。我只想重構現有類略:
ExportStringBuilder
ToString()
函數的參數你知道有是一些偉大的免費圖書館可用於此,是嗎?例如。看到this question
如果只有區別是分隔符,我只是通過該分隔符。其他一切都是矯枉過正。
如果有更多的差異,我會創建一個StringBuilderFactory
,返回IStringBuilder
。 ExcelStringBuilder
和CsvStringBuilder
都會實現該接口。您可以將參數傳遞給工廠,告訴工廠您是否需要Excel字符串構建器或CSV字符串構建器,並返回正確的參數。
如果你打算使用一個工廠,可以用工廠或獨立沿着使用的模板圖案。由於算法的大部分將只是一個步驟保持相同,並且在未來你可能有額外的步驟,以及(如新的分隔符)
下面是使用模板模式的一種方法。您可以使用「消氣」代替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 ",";
}
}
但你仍然需要工廠模式來創建適當的類權利? – gordanvij 2011-05-03 09:06:58
@gordanvij,你是對的。那就是我在第一個聲明中提到的。您可以使用模板模式和工廠模式,也可以獨立使用。這樣做的好處是你避免傳遞參數。既然你知道的要求好,你應該接電話:) – 2011-05-03 09:08:48