我看到的所有抽象工厂模式示例都使用抽象类来为工厂提供抽象。
是否总是需要使用抽象类?
考虑到我们可以愉快地使用接口(interface)。
如果我们使用接口(interface)会违反设计原则吗?
我正在阅读的示例
最佳答案
工厂不需要使用抽象类
。这主要取决于您要创建的对象的复杂性以及您可以在工厂之间重用多少代码。
您链接到的示例在某种程度上是为了演示抽象工厂模式的使用。该示例创建一个抽象工厂(工厂的“接口(interface)”),然后使用 ShapeFactory
和 ColorFactory
对其进行扩展。当调用 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))本身不可用。实际上,您可以使用Circle
或Square
,但不能使用Shape
。这并不意味着您的代码一般不能处理形状。
关于oop - 在抽象工厂模式中,主要的抽象工厂类,它总是必须是抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29915516/