我有一个简单的类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