【问题标题】:In abstract factory pattern the main abstract factory class, Does it always have to be an abstract class?在抽象工厂模式中主要的抽象工厂类,它总是必须是一个抽象类吗?
【发布时间】:2015-04-28 09:27:45
【问题描述】:

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

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

我正在阅读的示例

Tutorials Point
oodesign

【问题讨论】:

标签: oop design-patterns software-design


【解决方案1】:

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

您链接到的示例在某种程度上是为了演示抽象工厂模式的使用。该示例创建了一个抽象工厂(工厂的“接口”),然后使用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);

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

【讨论】:

    【解决方案2】:

    Interfaces 和他们的方法隐式为abstract,所以完全可以使用interface 而不是abstract cass,但为了保持抽象设计,您必须实现两者之一...

    【讨论】:

      【解决方案3】:

      1.Factory是一个抽象类。
      2.Factory可以创建接口或抽象类的任何子类。
      3.工厂方法返回类型是接口或者抽象类。

      【讨论】:

      • 对不起,我不明白答案。能详细点吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多