(抽象工厂)当你不能在派生的类中使用新方法时,为什么要这样做?

(Abstract Factory) Why do this when you can't use new methods in the derived classes?

我正在阅读抽象工厂模式。据我了解,客户端代码将通过抽象接口引用构造的对象。这意味着如果您扩展抽象工厂来创建具有新方法的对象,您将无法调用它们。这似乎是一个严格的限制。当客户端甚至无法访问任何新方法或变量时,为什么还要拥有所有这些子类?

抽象工厂的用户不能使用classes的构造函数而被迫通过抽象接口访问它们的事实正是使用该模式的要点之一。

假设您正在实施一个 class 来向客户发送电子邮件。

您可以发送客户 QuoteEmailsFollowUpEmails

您有两个选择:

  • 每次要发送其中一个时,请使用 new FollowUpEmail()new QuoteEmail()
  • 让您的代码与 EmailFactory 一起工作,并在您需要创建它们时调用 factory.createFollowUpEmail()factory.createQuoteEmail()

现在,如果使用第一个选项,则很难为 FollowUpEmail 和 QuoteEmail 引入不同的样式。

也许您想在 12 月发送圣诞节主题,或者在某些特定情况下发送正式电子邮件。

因此您可以创建 ChristmasQuoteEmailFormalQuoteEmail,但您需要修改所有创建电子邮件的代码才能使用它们。

使用第二个选项(抽象工厂),您的代码不知道电子邮件是如何创建的。因此,只需向您的代码发送 ChristmasEmailFactory,当您的代码使用 factory.createQuoteEmail() 时,就会创建正确的电子邮件。