java - 避免抽象静态方法(或覆盖静态方法)的设计模式

标签 java oop design-patterns static-methods abstract

我知道静态方法不能是abstracted它们也不能被覆盖,only hidden (and in which case late bindings don't happen) .关于这一点,我正在努力寻找一种逻辑方式来表达以下关系:

public abstract class Spell {
    protected int power;

    public Spell(int power) {
        this.power = power;
    }

    public int getPower() { return power; }

    // I know this is impossible, but please bare with me
    public abstract static int getMaxPower();
}

public class AttackSpell extends Spell {
    public AttackSpell(int power) {
        super(power);
    }

    public static int getMaxPower() { return 50; }
}

public class HealSpell extends Spell {
    public HealSpell(int power) {
        super(power);
    }

    public static int getMaxPower() { return 30; }
}

在这个人为的例子中,最大功率是我希望每个法术都知道的属性(Spell 的每个子类都有一个适用于其自身所有实例的单独最大功率)。在其他 SO 线程中,针对这种不可能情况的建议解决方案是使 getMaxPower() 成为实例方法。但是,我认为这没有意义,因为功率是一个实现细节,在实例化之前了解它很有用(例如,构建一个从功率 1 到该法术最大功率的法术实例数组)。

我看到的一个解决方案是为每个法术创建一个工厂(或为所有法术创建一个更通用的工厂),它有一个实例方法 getMaxPower() 知道法术的最大功率属性它实例化。但是,这对我来说似乎也不是最佳选择,因为:

  1. 了解每个咒语的属性更有意义
  2. 这使得 Spell 的子类忽略了实现细节(即,其构造函数无法检查提供的功率是否超过其最大功率)

工厂模式是正确的做法吗?如果是这样,它的逻辑依据是什么?如果不是,是否有更适合这个问题的模式?

最佳答案

我的第一个想法是断开生成法术和法术。

有一个描述法术系列和能量范围的类,然后使用它来创建范围内的法术集合,通过构造函数传递能量等。

然后您可以考虑某种数据文件,从而节省大量硬编码。

关于java - 避免抽象静态方法(或覆盖静态方法)的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20838135/

相关文章:

design-patterns - 如何使用工厂模式解析多个第三方api

php - 创建一个像 facebook 和 gmail 这样的线程私有(private)消息系统

java - 带用户输入的插入排序 double 组 - JAVA

wcf - 哦问题: applying same logic to 2 similar objects

c++ - 在 C++ 中将父类类型转换为子类

c# - 复合 Dto 更新,最佳实践

java - 如何在java中反转xml节点及其数据

java - Tomcat 启动时未找到 SSL 配置 : getting class(PureTLSImplementation, JSSE15Factory)

java - 如何使用 Java 更新用户的 externalId

Python 上下文对象更好地使用字典或属性?