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

时间:2015-04-28 09:27:46

标签: oop design-patterns software-design

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

鉴于这种情况,我们可以愉快地使用界面 如果我们使用界面会违反设计原则吗?

示例我正在阅读

Tutorials Point
oodesign

3 个答案:

答案 0 :(得分:1)

Interfaces及其方法隐含abstract因此,使用interface代替abstract cass完全可以,但为了保留抽象设计你必须实施其中一个......

答案 1 :(得分:1)

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

您链接到的示例有点人为地展示了抽象工厂模式的使用。该示例创建了一个抽象工厂(工厂的'界面),然后使用ShapeFactoryColorFactory进行扩展。调用ShapeFactory时,具体getColor()返回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 :(得分:0)

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