工厂设计模式和违反 OCP(开闭原则)

You*_*f13 5 java factory open-closed-principle

本教程中的工厂显然违反了 OCP。每次在系统中添加一个形状,我们都需要在工厂中添加它以支持它。我正在考虑另一个实现,我想知道是否有任何缺点。

public class ShapeFactory {

   //use getShape method to get object of type shape
   public Shape getShape(Class<? extends Shape> shapeType){
      return shapeType.newInstance();
   }
}
Run Code Online (Sandbox Code Playgroud)

这个实现看起来不违反OCP,也不复杂。有什么原因我找不到任何提到它的工厂设计模式教程吗?

Lef*_*une 3

我认为@hfontanez 对“工厂模式是否违反开放/封闭原则?”这个问题的回答。盖子。如果您要添加新的 Shape 子类,您还必须添加一种方法来创建它们的实例。假设您无法修改原始 ShapeFactory,因为它是第三方库的一部分,但您可以子类化或装饰原始工厂以添加对新形状的支持。扩展该示例将如下所示:

public class AdvancedShapeFactory {
  private final ShapeFactory factory = new ShapeFactory();

  public Shape getShape(String shapeType) {
    if (shapeType.equalsIgnoreCase("PENTAGON")) {
      return new Pentagon();
    } else {
      return factory.getShape(shapeType);
    }
  }    
}
Run Code Online (Sandbox Code Playgroud)

如果最初虚构的“形状”库的设计者希望能够轻松地通过形状类型创建新形状,他们可以实现一个注册表:

public class ShapeRegistry {
  private static final Map<String, Class<Shape>> shapeTypes = new HashMap<>();

  public void registerShape(String shapeType, Class<Shape> shapeClass) {
    shapeTypes.put(shapeType, shapeClass);
  }

  public Shape getShape(String shapeType) throws InstantiationException, IllegalAccessException {
    if (shapeTypes.containsKey(shapeType)) {
      return shapeTypes.get(shapeType).newInstance();
    }
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

值得阅读有关依赖注入的内容,Guice就是一个很好的例子。