我应该在这里建一个工厂吗?

本文关键字:一个 工厂 在这里 我应该 | 更新日期: 2023-09-27 17:54:15

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

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

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

我应该在这里建一个工厂吗?

不要过度设计。我只需要稍微重构一下现有的类:

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

你知道有一些很棒的免费库可用于此,是吗?例如:

如果只有的区别是分隔符,我将直接传递该分隔符。其他的都是多余的。

如果有更多的差异,我将创建一个返回IStringBuilderStringBuilderFactoryExcelStringBuilderCsvStringBuilder都将实现该接口。您将向工厂传递一个参数,该参数告诉工厂您是想要Excel字符串生成器还是CSV字符串生成器,它将返回正确的。

如果您计划使用工厂,您可以将模板模式与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 ",";
 }
}