【发布时间】:2015-04-28 09:27:45
【问题描述】:
我看到的所有抽象工厂模式的例子他们使用抽象类来为工厂提供抽象。
是否总是需要使用abstract class?
考虑到我们可以愉快地使用接口的情况。
如果我们使用 interface 会违反设计原则吗?
我正在阅读的示例
【问题讨论】:
-
使用接口和使用抽象类一样好
标签: oop design-patterns software-design
我看到的所有抽象工厂模式的例子他们使用抽象类来为工厂提供抽象。
是否总是需要使用abstract class?
考虑到我们可以愉快地使用接口的情况。
如果我们使用 interface 会违反设计原则吗?
我正在阅读的示例
【问题讨论】:
标签: oop design-patterns software-design
工厂不需要使用abstract class。这主要取决于您要创建的对象的复杂性以及您可以在工厂之间重用多少代码。
您链接到的示例在某种程度上是为了演示抽象工厂模式的使用。该示例创建了一个抽象工厂(工厂的“接口”),然后使用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);
编辑:只是吹毛求疵...在抽象工厂模式中,基础工厂总是抽象的。这是因为它将创建的基类(或接口)本身不可用。实际上,您可以使用Circle 或Square,但不能使用Shape。这并不意味着您的代码不能处理一般的形状。
【讨论】:
Interfaces 和他们的方法隐式为abstract,所以完全可以使用interface 而不是abstract cass,但为了保持抽象设计,您必须实现两者之一...
【讨论】:
1.Factory是一个抽象类。
2.Factory可以创建接口或抽象类的任何子类。
3.工厂方法返回类型是接口或者抽象类。
【讨论】: