2011-05-03 64 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