【问题标题】:Should I use a factory here我应该在这里使用工厂吗
【发布时间】:2011-05-03 08:45:46
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    您知道有一些很棒的免费库可用于此,是吗?例如。见this question

    【讨论】:

      【解决方案2】:

      如果唯一的区别是分隔符,我会传入那个分隔符。其他的一切都是多余的。

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

      【讨论】:

        【解决方案3】:

        如果您打算使用工厂,您可以将模板模式与工厂一起使用或单独使用。由于算法的大部分内容除了一个步骤外将保持不变,并且将来您可能还会有其他步骤(例如新的分隔符)

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

        【讨论】:

        • 但是您仍然需要工厂模式来创建适当的类吗?
        • @gordanvij,你是对的。这就是我在第一个声明中提到的。您可以将模板模式与工厂模式一起使用,也可以单独使用。这样做的好处是您避免传递参数。既然你很清楚需求,你应该接电话:)
        猜你喜欢
        • 1970-01-01
        • 2014-04-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 2016-11-11
        相关资源
        最近更新 更多