【问题标题】:Using factory pattern with an abstract class [closed]将工厂模式与抽象类一起使用 [关闭]
【发布时间】:2017-11-06 21:58:48
【问题描述】:

我可以通过使用抽象类来编写工厂模式吗?

例如我在解析电子邮件,有多种类型的电子邮件,每种电子邮件类型都有自己的解析器类,所有解析器类都扩展了具有一些通用代码的主要抽象解析器类。

对于我从服务器读取的每封电子邮件,我都会调用工厂 (EmailParserFactory) 以获取适当的电子邮件解析器
问题是工厂模式依赖于一个通用接口(在经典的 Java 工厂模式中,“形状”就是接口)
Factory UML
在我的示例中,我在主解析器中维护一些通用逻辑,因此我需要它抽象类。

我不确定工厂模式是否是正确的方法。

目前我想出的设计如下:

EmailParser parser EmailParserFactory.getAppropriateEmailParser(email) ;
ParsedEmail = parser.getParsedEmail(email) -- parser is already the appropriate parser, sending it the email message will get back a parsed object.

对象:

     EmailParserFactory
        private getEmailType(emailMessage) --    will check email type
                                                    - if email subject contains feedback its a feedback email  
                                                    - if the email contains GUID then  its a reply email etc

    EmailParser         - abstract class
      getBodyText() - common for all 

      ComplaintEmailParser  - specific parser for Complaint Email
        parseEmail()
      FeedbackEmailParser  - specific parser for Feedback Email
        parseEmail()
      ReplyEmailParser  - specific parser for Reply Email
        parseEmail()

【问题讨论】:

  • 我不明白你到底在问什么。您似乎设计了一种可行的架构。尽管我建议您将EmailParser 用作接口而不是类,但您没有理由不能拥有所有当前EmailParser 实现扩展的抽象基类。您有具体的担忧吗?对于 SO 来说,要求进行整体设计审查的范围太广了。
  • @user648026 - 实现接近静态工厂,除了EmailParserFactory.getAppropriateEmailParser(email) 静态调用。但是,如果所有解析的邮件都是相同的type并且可以共同处理,那么使用工厂方法getEmailParser(),创建者为Abstract EmailProcessor(包含通用处理代码)的工厂方法的最佳用例,作为SpecificEmailParser的具体创建者。请参考我之前对类似问题的回答 - stackoverflow.com/questions/46384358/…

标签: java design-patterns


【解决方案1】:

您可以使用组合而不是继承。实际上,您有与 Parser 无关的方法 getBodyText()。因此,您可以将其提取到 BodyTextExtractor 并将该提取器注入您的所有解析器。之后重构 EmailParser 转换为与一种方法 (SRP) 的接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多