工厂模式,需要知道实际的实现类型?

时间:2012-06-29 07:49:33

标签: c# design-patterns c#-4.0 factory-pattern

我试图将SProc的结果写入文本文件。我有3个场景:

  1. SProc没有参数。

  2. SProc接受参数。

  3. SProc接受参数,并且有一个循环可以增加参数。

  4. 方案1和2的数据将存储在列表中,因为它们最有可能只是一行结果。

    方案3的数据将存储在数据表中。

    我正在考虑使用工厂模式,3个不同的类,每个类实现一个特定的接口,以及一个工厂来确定需要哪3个。

    问题是一旦方法完成并且完成事件已经上升,我需要知道实现了什么场景(datatable vs List)这是一个问题吗?如果是这样,有人可以解释为什么+一个可能的解决方案?

    注意:只是为了澄清,这不是请求,请写下我的程序。

    非常感谢你的时间,我很感激。

1 个答案:

答案 0 :(得分:2)

每当您需要知道接口背后的实际类型时,您可能选择了一个错误的点来介绍接口。这就是这里的样子。

在我看来,您希望将逻辑(产生一些数据)的关注与记录结果的逻辑(在本例中为文本文件,但可能还有其他目标,对吗?)分开。 。为什么不为ResultLogging引入一个接口?

interface IResultLogger
{
   void LogList(List<Something> data);
   void LogDataTable(DataTable data);
}

并将此接口的实例传递给所有执行逻辑的方法?

如果您不希望在这些方法中使用“logging”(调用IResultLogger接口),则可以添加另一个抽象:“ResultData”的概念。

abstract class ResultData
{
   abstract public void LogToResultLogger();
   //add methods to access the data in a way you might need for other things in your program
}

并派生“ListResultData”和“DataTableResultData”。

我在这里看不到工厂模式的价值。

另一种方法是使用

class ListLogger
{
   public void LogList(List<Something> data) {}
}

class DataTableLogger
{
   public void LogDataTable(DataTable data) {}
}

并做

void method1() and method2()
{
  //do logic
  new ListLogger().LogList(data);
}

void method3()
{
  //do logic
  new DataTableLogger().LogDataTable(data);
}