oop - 在抽象工厂模式中,主要的抽象工厂类,它总是必须是抽象类吗?

标签 oop design-patterns software-design

我看到的所有抽象工厂模式示例都使用抽象类来为工厂提供抽象。
是否总是需要使用抽象类?

考虑到我们可以愉快地使用接口(interface)
如果我们使用接口(interface)会违反设计原则吗?

我正在阅读的示例

Tutorials Point
oodesign

最佳答案

工厂不需要使用抽象类。这主要取决于您要创建的对象的复杂性以及您可以在工厂之间重用多少代码。

您链接到的示例在某种程度上是为了演示抽象工厂模式的使用。该示例创建一个抽象工厂(工厂的“接口(interface)”),然后使用 ShapeFactoryColorFactory 对其进行扩展。当调用 getColor() 时,具体的 ShapeFactory 返回 null,反之亦然。这违反了 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);

编辑:只是为了挑剔...在抽象工厂模式中,基础工厂始终是抽象的。这是因为它创建的基类(或接口(interface))本身不可用。实际上,您可以使用CircleSquare,但不能使用Shape。这并不意味着您的代码一般不能处理形状。

关于oop - 在抽象工厂模式中,主要的抽象工厂类,它总是必须是抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29915516/

相关文章:

c - 如何检查函数是否正在回调自身

unit-testing - TDD:为什么是 'Red Green Refactor' 而不是 'Green Refactor' ?

matlab - 在父类(super class)方法中修改子类的不可变/ protected 变量

ios - 如何从不同 View 调用CoreLocation

c# - C#房间管理程序

design-patterns - 设计网站权限方案的资源

python - python中类的实例化之间的区别

c - C中有 "design patterns"吗?

design-patterns - 单一职责原则是否会促进许多小类(class)的逻辑分组?

java - 简单工厂和工厂方法设计模式的区别