在抽象工厂模式中主要的抽象工厂class,它是否总是必须是一个抽象class?

In abstract factory pattern the main abstract factory class, Does it always have to be an abstract class?

我看到的所有示例 抽象工厂模式 他们使用抽象 class 来为工厂提供抽象。
是否总是需要使用 abstract class

在这种情况下我们可以愉快地使用接口
如果我们使用 interface 是否会违反设计原则?

我正在阅读的例子

Tutorials Point
oodesign

Interfaces 并且它们的方法是隐含的 abstract 所以使用 interface 代替 abstract cass 是完全可以的,但是为了保持抽象设计你必须实现两者之一...

1.Factory 是一个摘要 class.
2.Factory 可以创建接口或抽象的任何子class class。
3.The 工厂方法 return 类型是接口或抽象 class.

工厂不需要使用 abstract class。这主要取决于你要创建的对象的复杂程度以及你可以在工厂之间重复使用多少代码。

您 link 的示例在某种程度上是为了演示抽象工厂模式的使用而设计的。该示例创建一个抽象工厂(工厂的 'interface'),然后使用 ShapeFactoryColorFactory 对其进行扩展。当调用 getColor() 时,具体的 ShapeFactory returns 为空,反之亦然。这违反了 single responsibility principle.

相反,我会建议这种设计,以表明您并不总是需要抽象工厂,但也可以使用更简单的 factory method pattern

public interface Shape {
    void Draw();
}

public class Square : Shape {
    public void Draw() { //... }
}

public class Circle : Shape {
    public void Draw() { //... }
}

public enum ShapeType {
    Square,
    Circle
}

public class ShapeFactory {
    public Shape CreateShape(ShapeType type) {
        switch (type) {
            case ShapeType.Square:
                return new Square();
            case ShapeType.Circle:
                return new Circle();
            default:
                throw new Exception("Unsupported ShapeType: " + type);
        }
    }
}

像这样使用具体的 ShapeFactory:

var factory = new ShapeFactory();
var circle = factory.CreateShape(ShapeType.Circle);

编辑: 只是吹毛求疵...在抽象工厂模式中,基础工厂总是抽象的。这是因为它创建的基础class(或接口)本身是不可用的。实际上,您可以使用 CircleSquare,但不能使用 Shape。这并不意味着您的代码一般无法处理形状。