工厂模式违反了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;
}
}
这种自动注册的东西是个坏主意。最终,要知道实际注册了哪些工厂,它们的名称是什么以及由此支持哪些名称字符串将非常困难。
保持简单明了更好,容易。通常,它类似于:
ShapeFactory
应该具有将形状类型字符串映射到相应工厂的Map<String, Supplier<Shape>>
;和ShapeFactory
或它的构建器,应具有一个addShapeType(String,Supplier<Shape>)
,用于在创建ShapeFactory
实例时注册所有类型。