2012-07-11 49 views
3

正如所说的“如果我们有超类和n个子类,并且基于提供的数据,我们必须返回其中一个子类的对象,我们使用工厂模式“使用工厂设计模式时有点复杂

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

解决方案: 为此,我想我将不得不使用工厂设计模式,创建20个班,每个班都有自己的执行每一个领域,比如如何和它有哪个地方在文件解压缩。当新的客户被添加时,我只是创建一个新的类,我完成了,不需要其他更改。

我是否正确到这里?

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

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

希望我自己清楚,感谢

回答

1

我觉得这是一个很好用的工厂方法,但不要试图使用客户端类层次结构的提取算法模型和。就模式而言,您可以使用Strategy以正确的提取算法动态配置客户端对象。

+0

“客户端类层次结构模型的提取算法以及”对不起,得到这个? – shabby 2012-07-12 03:18:27

+0

如果多个客户端使用相同的提取算法,请勿尝试将共享提取算法放入公共超类。找到另一种分享方式,或许使用策略模式。 – ComDubh 2012-07-12 11:34:16

+0

就像在这种情况下的策略的想法一样,我认为我应该去做这件事,但为什么不使用公共超类中的任何已知问题呢? – shabby 2012-07-13 03:13:02

1

您至少有两件事情在这里进行。

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

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

希望这会有所帮助。

+0

我认为一个更好的主意,但要连接这两个?如果我创建了两个工厂,解析的第一个工厂调用文本抽取工厂还是什么? – shabby 2012-07-12 03:21:06

1

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

  1. 20个客户端中的每个客户端是否都有一个FileFormat?
  2. 子类之间常见的(行为/方法)是什么?
  3. 是否有可能改变子类,使用不同的FileFormat?

在子类不需要切换文件类型最简单的办法,好像现在你可以有它由一组抽象类PdfProvider,XlsProvider,HtmlProvider和TxtProvider的子类的抽象的ContentProvider。这个中间层的类实现了文件格式特定的功能。然后你的20个“客户”类继承适当的FileFormat特定的基础。

+0

1.不,他们可以有一个PDF/Excel或HTML文件 2.常见的行为是像每个文件将有一个日期,客户号,产品号。等等。 3.是的,它有一个小的机会,但我们不想迎合 – shabby 2012-07-13 03:06:32