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

标签 java design-patterns

所以我有一个类 AbtractParent 和任意数量的扩展它的子类。

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

最终,我希望能够按照以下方式编写代码

if(AbstractParent.doesStringRepresentSubClass("example String"))
   AbstractParent.getInstOfSubClassReppedBy("example String");

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

问题在于,通过这样做,AbstractParent 现在知道它的每一个子类,这似乎与 OOP 的思想背道而驰。

我唯一的其他解决方案是

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

他们是更好、更适合 OOP 的设计方式吗?

谢谢大家!

编辑 1:字符串表示不会与类名相同,因此不能使用反射转换为类型。

编辑 2:这里的最终目标是遵循打开关闭原则,因此子类的创建应该只需要编辑子类文件。因此,不能使用工厂方法来完全解决问题。

也就是说,将我的上述代码分为工厂类和抽象父类绝对是我将实现的良好设计。

最佳答案

在我看来,您正在尝试实现 factory method .

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

例如

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

关于java - 抽象类需要知道所有扩展类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4860411/

相关文章:

html - 寻找一种高效抽象内联样式的系统方法

java - 我们如何确保我们只能创建一个类的一个实例?

java - 如何使 CORS 过滤器在具有基本身份验证的 Jersey REST 中工作?

java - antlr 标识符名称与预定义函数名称相同导致 MismatchedTokenException

C++ 模板 - 如何跨多个 MTU 使用

java - BO 和服务之间的区别?

php - 你会如何做一个带有修订的评论系统?

java - 为什么表格不显示在本地主机(jsp 文件)中?

java - 在 Java 和 Python 中生成相同的随机数

java - 写入 CSV 文件时,之前的字符串将被覆盖