Tun*_*rit 0 java design-patterns solid-principles
工厂模式违反了 OCP 原则,因为它使用if()语句,这意味着如果添加任何类,则工厂类必须更改,这违反了 SOLID 原则。自注册类应该根据以下资源解决此问题:http://www.jkfill.com/2010/12/29/self-registering-factories-in-c-sharp/。问题是我不懂C#。有人可以用 Java 举一个例子吗?提前致谢。
public class ShapeFactory {
//The purpose of self registering classes is to avoid if's
public Shape getShape(String shapeType){
if(shapeType == null){ //Get rid of this
return null;
}
if(shapeType.equalsIgnoreCase("CIRCLE")){
return new Circle();
} else if(shapeType.equalsIgnoreCase("RECTANGLE")){
return new Rectangle();
} else if(shapeType.equalsIgnoreCase("SQUARE")){
return new Square();
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
这种自我注册的做法是个坏主意。最终,要知道哪些工厂实际上已注册、它们的名称是什么以及因此支持哪些名称字符串将变得极其困难。
让事情简单明了更好,也更容易。通常,它会是这样的:
ShapeFactory应该有一个Map<String, Supplier<Shape>>将形状类型字符串映射到相应工厂的函数;和ShapeFactory或其构建器应该有一个 ,addShapeType(String,Supplier<Shape>)用于在创建ShapeFactory实例时注册所有类型。