3

正如所说“如果我们有一个超类和 n 个子类,并且根据提供的数据,我们必须返回其中一个子类的对象,我们使用工厂模式”

情况: 我有20个客户,随着时间的推移可以添加更多。每个都将提供一个文件,从中提取数据并将其插入到数据库中。每个客户都有自己的文件维护方式,即数据字段位于不同的位置。

解决方案: 为此我认为我将不得不使用工厂设计模式,我创建了 20 个类,每个类对每个字段都有自己的实现,比如它必须如何以及从文件中的哪个位置提取它。随着新客户端的添加,我只需创建一个新类就完成了,不需要进行其他更改。

到这里为止我是正确的吗?

复杂性: 现在的问题是客户提供的文件可以是 4 种格式(PDF、XLS(X)、HTML、TXT)中的任何一种。从这些格式中提取文本的引擎必须是静态的,比如我使用 pdftoXML 将 PDF 提取为 XML 等。如果我不创建一个单独的引擎类来将 PDF 转换为 XML,那么我将不得不重新编写在每个提供 PDF 文件的客户类中提取 PDF 文本。excel提取引擎也是如此。

问题: 我应该如何将这些引擎纳入工厂模式?引擎类是否应该是静态的,并且必须处理 pdf 的子类例如调用 pdf 类的提取方法来获取所需的数据或什么?

希望我说清楚了,谢谢

4

3 回答 3

1

首先,几个问题。这些可能会改变建议的解决方案:

  1. 20 个客户端中的每一个是否都有一个文件格式?
  2. 子类之间有什么共同点(行为/方法)?
  3. 是否有可能子类可能会更改以使用不同的文件格式?

在子类不需要切换文件类型的最简单的解决方案中,似乎现在您可以拥有一个抽象的 ContentProvider,它由一组抽象类 PdfProvider、XlsProvider、HtmlProvider 和 TxtProvider 子类化。这个中间层的类实现了文件格式特定的功能。然后,您的 20 个“客户端”类继承自相应的特定于 FileFormat 的基础。

于 2012-07-12T12:34:37.387 回答
1

我认为这是对工厂方法的一个很好的使用,但也不要尝试使用客户端类层次结构来对提取算法进行建模。在模式方面,您可以使用策略来动态配置具有正确提取算法的客户端对象。

于 2012-07-11T18:07:12.730 回答
1

你有(至少)两件事在这里发生。

  1. 从一系列文件格式中提取文本
  2. 根据客户端特定规则解析此文本。

我会将这些功能完全分开。甚至可能有两个工厂,一个用于文本提取,一个用于解析。进行解析的客户端特定代码不需要知道文本来自 PDF、CSV 或通过 http 或其他方式输入。它只需要知道解析文本。

希望这可以帮助。

于 2012-07-11T18:31:38.100 回答