如何在Java中创建自注册工厂?

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)

Mat*_*ans 5

这种自我注册的做法是个坏主意。最终,要知道哪些工厂实际上已注册、它们的名称是什么以及因此支持哪些名称字符串将变得极其困难。

让事情简单明了更好,也更容易。通常,它会是这样的:

  • ShapeFactory应该有一个Map<String, Supplier<Shape>>将形状类型字符串映射到相应工厂的函数;和
  • ShapeFactory或其构建器应该有一个 ,addShapeType(String,Supplier<Shape>)用于在创建ShapeFactory实例时注册所有类型。