繁体   English   中英

寻找[也许]设计模式

[英]Looking for a [maybe] design pattern

这是我的情况。 用户在我的软件中选择一个文档,然后我的软件从文档中提取一些关键数据。 该软件处理两种格式; PDF和DOCX。 对于每种类型,都有几个模板,并且上载的文档应该属于这些模板之一。 我不知道这是否是一个众所周知的问题,是否存在解决此情况的既定设计模式(这就是我坚持使用SO的原因)。 到目前为止,这是我设计的:

由于每个模板都有特定的结构/内容,因此我正在考虑为每个模板创建单独的类。 将有一个称为IExtractor的顶级接口,然后将有两个名为PdfExtractor和DocxExtractor的顶级类,每个类均实现IExtractor接口。 所有PDF(或DOCX)模板通用的所有功能都将进入这些父类。

在这两个父类下面,将有几个模板类,每个模板类一个。 例如,从PdfExtractor继承的名为Template571_PdfExtractor的类具有特定于Template 571的方法,但提供的结果与任何其他提取器的形式相同。

如果这很重要,我正在使用C#4.0。 这是骨架:

界面:

interface IExtractor
{
void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill);
}

两个父类:

public class DocxExtractor : IExtractor 
{
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill)
    {
    }
}

public class PdfExtractor : IExtractor 
{
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill)
    {
    }
}

具体类别之一:

public class Template571_PdfExtractor : PdfExtractor
{
    public virtual void ExtractDocument(System.IO.FileInfo document, dsExtract dsToFill)
    {
    }
}

现在有一些我不确定的关键问题。 所有这些都围绕着我不知道如何以及在何处实例化具体(模板)类的对象的问题。 我可以使用文件扩展名来确定是否需要关闭PdfExtractor树节点或DocxExtractor节点。 之后,文件的内容告诉我用户文档所属的模板。 那么,该“决策”代码应该放在哪里? 我的想法是将其放在PdfExtractor类(或DocxExtractor)中。 那是正确的方法吗?

抱歉,我待了一段时间,但是我不知道如何完整描述我的情况。 感谢您的想法。

舒贾特

一旦深入研究了设计模式,您肯定会发现大多数时候没有一种正确的方法来实现某些东西。

一种可能的方法是创建所谓的工厂类:一种用于PdfExtractors,另一种用于DocXExtractors。 每个工厂类可能只有一个静态方法,例如

public final class PdfExtractorFactory {
   public static PdfExtractor getExtractor(String filename) { ... }

   ... // constructor, or singleton getter here
}

决定要返回的PdfExtractor实例的具体子类(即,使用哪个模板)的逻辑将驻留在factory方法中。 这样,抽象基类PdfExtractor或其子类都不会因此决策逻辑而混乱。 仅工厂类将需要了解PdfExtractor的子类(分别是DocXExtractor),而其余代码将完全不知道具体的子类,因为工厂会传递超类的实例。

由于您可能仅需要PdfExtractorFactory和DocXExtractorFactory的单个实例,因此您可以选择将这些工厂类实现为单例。

更新 :当然,您可以使用静态工厂方法或Singleton模式,也可以使用非静态工厂方法(但您不需要两者都使用)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM