抽象类需要知道所有扩展类吗?

djs*_*s22 3 java design-patterns

所以我有一个类,AbtractParent,以及扩展它的任意数量的子类.

每个子类都有一个与之关联的字符串.

最终,我希望能够编写代码

if(AbstractParent.doesStringRepresentSubClass("example String"))
   AbstractParent.getInstOfSubClassReppedBy("example String");
Run Code Online (Sandbox Code Playgroud)

我目前的解决方案是将地图存储为AbstractParent的静态变量,并让每个子类将自身的实例及其字符串添加到此映射中.

问题是,通过这样做,AbstractParent现在知道它的每个子类,这似乎与OOP的想法相反.

我唯一的解决方案是

  1. 有一个配置文件,其中每个子类写入其类名和字符串表示
  2. 每次我创建一个子类时,都会在doesStringRepresentSubClass中的if-else语句中添加一行代码.

他们是一个更好的,更多OOP正确的设计方式吗?

谢谢大家!

编辑1:字符串表示形式与类名称不同,因此不能使用反射强制转换为类型.

编辑2:这里的最终目标是遵循Open Close原则,因此创建子类应该只需要编辑子类文件.因此,工厂方法不能完全用于解决问题.

也就是说,将上面的代码分成工厂类和抽象父类绝对是我要实现的好设计.

Bri*_*new 5

这对我来说就像你在尝试实现工厂方法一样.

您的工厂方法将了解每个子类以及如何在给定字符串的情况下实例化它.请注意,此知识不在您正在创建的对象的基类中.

例如

public class Factory {
   public AbstractParent newInstance(String spec) {
      if ("example String".equals(spec)) {
         return new ExampleStringSubclass();
      }
      // etc.
   }
}
Run Code Online (Sandbox Code Playgroud)