我可以使用抽象类编码工厂模式吗?
例如,我正在解析电子邮件,有多种类型的电子邮件,每种电子邮件类型都有自己的解析器类,所有解析器类都扩展了具有一些通用代码的主抽象解析器类。对于我从服务器读取的每封电子邮件,我打电话给工厂(EmailParserFactory)以获取相应的电子邮件解析器
问题在于,工厂模式工厂依赖于一个通用接口(在经典的Java工厂模式中," Shape"是接口)
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()
答案 0 :(得分:2)
您可以使用合成而不是继承。实际上,您的方法getBodyText()
与Parser无关。因此,您可以将其提取到BodyTextExtractor
并将该提取器注入所有解析器。之后,重构EmailParser
转换为与一种方法(SRP)的接口。