我正在阅读抽象工厂模式。据我所知,客户端代码将通过抽象接口引用构造的对象。这意味着如果扩展抽象工厂以创建具有新方法的对象,则无法调用它们。这似乎是一个严格的限制。当客户端甚至无法访问任何新方法或变量时,为什么要拥有所有这些子类?
答案 0 :(得分:1)
抽象工厂的用户不能使用类的构造函数并被迫通过抽象接口访问它的事实正是使用该模式的一个要点。 / p>
假设您正在实施一个将向客户发送电子邮件的类。
您可以发送客户QuoteEmails
和FollowUpEmails
。
您有两种选择:
new FollowUpEmail()
和new QuoteEmail()
EmailFactory
一起使用,并在需要创建时调用factory.createFollowUpEmail()
和factory.createQuoteEmail()
现在,如果使用第一个选项,那么为FollowUpEmail和QuoteEmail引入不同的样式真的很难。
也许您想在12月份发送圣诞主题,或在某些特定情况下发送正式的电子邮件。
因此,您可以创建ChristmasQuoteEmail
和FormalQuoteEmail
,但您需要修改所有创建电子邮件的代码才能使用它们。
使用第二个选项(抽象工厂),您的代码不知道如何创建电子邮件。因此,只需向代码发送ChristmasEmailFactory
,当您的代码使用factory.createQuoteEmail()
时,就会创建正确的电子邮件。