当前位置: 首页 > 知识库问答 >
问题:

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

阎咏思
2023-03-14

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

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

共有2个答案

司马高韵
2023-03-14

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

在我看来,答案是否定的,从技术上讲,这不会是一个工厂模式。只要它解决了您的用例,并使代码可读和可维护(试图严格遵循设计模式通常会导致误用它们和过度架构),它就不必如此。

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

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

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

当然,您可以有Abstract2DShapeAbstract3DShape抽象类来实现Shape;关键是您能够创建和使用Shape而不知道它是2D还是3D形状。

须景辉
2023-03-14

我会同意的。

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

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

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

如果这是一个接口或抽象类,那么它是一个特定于具体情况的实现细节,只要您的工厂实现让您实现模式背后的动机。

如果这些语句中的任何一个适用于您的情况,请考虑使用抽象类:

>

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

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

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

    如果这些语句中的任何一个适用于您的情况,请考虑使用接口:

    >

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

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

    您想利用类型的多重继承。

    在某些实现中,对于工厂创建的产品,使用抽象类比接口更有意义。如果所有产品之间有一组共享的特性/行为,那么将它们放入基本抽象类是有意义的。即使产品是由不同的工厂生产的,这一点也适用。

    它归结为:您是否愿意以及在产品之间引入耦合是否有意义?最终,客户将得到相同的结果 - 基于规范构建的产品,并抽象出构造细节。

  •  类似资料:
    • 主要内容:介绍,实现,Shape.java,Rectangle.java,Square.java,Circle.java,Color.java,Red.java,Green.java,Blue.java,AbstractFactory.java,ShapeFactory.java,ColorFactory.java,FactoryProducer.java,AbstractFactoryPatternDemo.java抽象工厂模式(Abstract Factory Pattern)是围绕一个超级

    • 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要

    • 简介 抽象工厂模式是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。 简例 有个

    • 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 介绍 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 主要

    • 抽象工厂模式 前面我们写过的工厂模式实际上是对产品的抽象。对于不同的用户需求,我们可以给予不同的产品,而且这些产品的接口都是一致的。而抽象工厂呢?顾名思义,就是说我们的工厂是不一定的。怎么理解呢,举个例子。 假设有两个水果店都在卖水果,都卖苹果和葡萄。其中一个水果店买白苹果和白葡萄,另外一个水果店卖红苹果和红葡萄。所以说,对于水果店而言,尽管都在卖水果,但是两个店卖的品种不一样。 既然水果不一样,

    • 抽象工厂模式 亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示: 1、一系列相关产品, 例如 椅子Chair 、 ​ 沙发Sofa和 咖啡桌Coffee­Table 。 2、系列产品的不同变体。 例如, 你可以使用 现代Modern 、 ​