我应该在这里使用工厂吗?

时间:2011-05-03 08:45:46

标签: c# .net design-patterns factory-pattern

我有一个简单的类ExcelStringBuilder。它用于构建可以导出到Excel的字符串。现在我还需要构建一个CSV字符串。

我看到实现这两个类的唯一区别是在构建字符串时要使用的分隔符。对于Excel,它将是“\ t”制表符,CSV为“,”逗号。

我认为将分隔符作为参数传递给ExcelStringBuilder类构造函数。这是一个正确的决定还是我应该选择工厂模式?

3 个答案:

答案 0 :(得分:3)

不要过度设计它。我只是稍微重构现有的类:

  • 将其重命名为ExportStringBuilder
  • 在构造函数中传递分隔符,或作为ToString()函数
  • 的参数

你知道有一些很棒的免费图书馆,你呢?例如。见this question

答案 1 :(得分:1)

如果唯一差异是分隔符,我只会传递该分隔符。其他所有内容都是过度的。

如果存在更多差异,我会创建一个返回StringBuilderFactory的{​​{1}}。 IStringBuilderExcelStringBuilder都会实现该接口。您可以将参数传递给工厂,该工厂告诉工厂您是否需要Excel字符串构建器或CSV字符串构建器,并返回正确的参数。

答案 2 :(得分:1)

如果您打算使用工厂,可以将模板模式与Factory一起使用或单独使用。由于算法的大多数部分将保持相同,除了一步和将来您可能还有其他步骤(如新的分隔符)

这是使用模板模式的一种方法。您可以使用“Getter”代替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 ",";
 }
}