如果我在实现工厂模式时使用抽象类而不是接口。它仍然是工厂模式吗?

2022-09-04 21:24:09

例如:http://www.tutorialspoint.com/design_pattern/factory_pattern.htm

如果我在抽象类 Shape 上更改接口形状,请创建具体类来扩展 Shape,并使 Shape 工厂返回 Shape 抽象类类型化对象。它仍然是工厂模式吗?


答案 1

我会选择是的。

让我们看一下工厂方法模式的定义:

工厂方法模式是一种创建模式,它使用工厂方法来处理创建对象的问题,而无需指定将要创建的对象的确切类别

此模式背后的动机是使用对象将对象创建与客户端分开。客户端应向工厂提供规范,但工厂会抽象出如何构建对象的详细信息。

如果这是一个接口或抽象类是特定于情况的实现细节,只要你的工厂实现可以让你实现模式背后的动机。

如果以下任何语句适用于您的情况,请考虑使用抽象类:

  • 您希望在几个密切相关的类之间共享代码。

  • 您希望扩展抽象类的类具有许多常用方法或字段,或者需要公共以外的访问修饰符(如受保护和私有)。

  • 您希望声明非静态或非最终字段。这使您能够定义可以访问和修改它们所属对象的状态的方法。

如果以下任何语句适用于您的情况,请考虑使用接口:

  • 您希望不相关的类能够实现您的接口。例如,可比较和可克隆的接口由许多不相关的类实现。

  • 您希望指定特定数据类型的行为,但不关心谁实现了其行为。

  • 您希望利用类型的多重继承。

在某些实现中,使用抽象类而不是工厂创建的产品的接口甚至可能更有意义。如果所有产品之间存在一组共享的功能/行为,那么将它们放入基本抽象类中确实是有意义的。即使产品是从不同的工厂制造的,这也可能适用。

它归结为:您是否希望并且是否有意义引入产品之间的耦合?最后,客户将获得相同的结果 - 基于规格构建的产品,并将施工细节抽象出来。


答案 2

当涉及到这些差异时,答案总是肯定的和否定的。设计模式不是任何一种精确的规范,它们更像是一组最佳和推荐的实践,它们的实现因情况而异。

在我看来,答案是否定的,从技术上讲,这不是工厂模式。而且它不必是,只要它解决了你的用例,并使代码可读和可维护(试图从字面上坚持设计模式通常会导致滥用它们和过度架构)。

如果我们看一下抽象工厂模式(在链接页面中工厂模式的正下方),我们将看到它是一个用于创建工厂的工厂。现在假设我们有两个工厂,它们可以由 和 创建,这两个工厂都生成对象。ShapeAbstractFactoryShapeFactory2DShapeFactory3DShape

如果是抽象类,那么您将强制2D和3D对象继承相同的实现,尽管这可能毫无意义(它们可以以完全不同的方式实现)。Shape

因此,从技术上讲,为了使它真正成为工厂模式,必须不存在关于实现细节的假设,这意味着包含部分实现的抽象类不应该在工厂接口级别使用。

当然,你可以有和抽象类实现;关键是您可以创建和使用,而无需知道它是2D还是3D形状。Abstract2DShapeAbstract3DShapeShapeShape


推荐