gpt4 book ai didi

java - AbstractClass.getInstance() 方法是一种反模式吗

转载 作者:行者123 更新时间:2023-12-02 09:47:30 24 4
gpt4 key购买 nike

在某些存在类层次结构并且最顶层基类是抽象类的地方,抽象类中有一个静态 getInstance() 方法。这将负责创建正确的子类并将其返回给调用者。例如,考虑下面的代码。

public class abstract Product {

public static Product getInstance(String aCode) {
if ("a".equals(aCode) {
return new ProductA();
}
return ProductDefault();
}
// product behaviour methods
}

public class ProductA extends Product {}

public class ProductDefault extends Product {}

在 Java 中,java.util.Calendar.getInstance() 是遵循此模式的地方。然而,这意味着每次引入新的子类时都必须修改基类。即:在上面的示例中必须修改产品类别。这似乎违反了ocp原则。此外,基类知道子类的详细信息,这又是有问题的。

我的问题是...

  1. 上面的模式是反模式吗?
  2. 使用上述模式有哪些缺点?
  3. 可以采用哪些替代方案?

最佳答案

该界面不是反模式。但由于您所确定的原因,您实现它的方式相当糟糕。更好的想法是采用某种机制为每个代码注册工厂对象:

  • Java 类库使用 SPI 和代码来完成此类操作,这些代码可以反射性地查找要动态加载的“提供者”类。

  • 一种更简单的方法是拥有一个“注册表”对象,并使用依赖项注入(inject)或工厂对象类中的静态初始化程序或从属性文件中读取类名的启动方法等来填充它。

关于java - AbstractClass.getInstance() 方法是一种反模式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16371029/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com