正如所说“如果我们有一个超类和n个子类,并且根据提供的数据,我们必须返回其中一个子类的对象,我们使用工厂模式”
情况: 我有20个客户,更多可以添加时间。每个都将提供一个文件,从中提取数据并将其插入到数据库中。每个客户都有自己的主要文件样式,即数据字段位于不同的位置。
解决方案: 为此,我想我将不得不使用工厂设计模式,我创建了20个类,每个类都有自己的每个字段的实现,比如文件中的文件位置和提取方式。随着新客户端的添加,我只需创建一个新类,我就完成了,不需要进行任何其他更改。
我在这里说错了吗?
复杂度: 现在问题是客户端提供的文件可以是4种格式(PDF,XLS(X),HTML,TXT)中的任何一种。从这些格式中提取文本的引擎必须是静态的,就像我使用pdftoXML将PDF提取到XML等。如果我不创建一个单独的引擎类,只是将PDF转换为XML,那么我将不得不重新编写的功能在每个客户端的类中提取PDF文本,以PDF格式提供文件。 excel提取引擎也是如此。
问题: 我应该如何将这些发动机加工成工厂模式?如果引擎类是静态的,并且例如必须处理pdf的子类,则调用pdf类的extract方法来获取所需的数据或什么?
希望我明白了,谢谢
答案 0 :(得分:1)
我认为这很好地使用了Factory方法,但是也不要尝试使用客户端类层次结构来对提取算法进行建模。在模式方面,您可以使用策略使用正确的提取算法动态配置客户端对象。
答案 1 :(得分:1)
你这里至少有两件事。
我会完全分开这些功能。也许甚至有两个工厂,一个用于文本提取,一个用于解析。执行解析的客户端特定代码不需要知道文本来自PDF,CSV或通过http或其他任何方式传送。它只需要知道解析文本。
希望这有帮助。
答案 2 :(得分:1)
首先,提出几个问题。这些可能会改变建议的解决方案:
在最简单的解决方案中,子类不需要切换文件类型,现在看来你可以有一个抽象的ContentProvider,它由一组抽象类PdfProvider,XlsProvider,HtmlProvider和TxtProvider子类化。这个中间层实现了特定于文件格式的功能。然后,您的20个“客户端”类继承自相应的FileFormat特定基础。