【发布时间】: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