如何设计一个类层次结构,它提供有关子类的信息而不实例化它

时间:2016-03-06 20:43:35

标签: java class-design

我试图在游戏中为法术设计课程。

首先,我有一个带有拼写簿的玩家,表明该玩家可以使用哪些法术

public class Player {
    private List<Class<? extends Spell>> speellBook;
}

现在我创造了一些法术

public abstact class Spell { 
    public abstact double getDmg(); 
    private double position x;
    private double position y;
}
public class FireBolt extends Spell {
    public double getDmg() { return 15; }
}
public class FrostBolt extends Spell {
    public double getDmg() { return 10; }
}

现在我想展示一个关于FireBolt的工具提示,它表明这个法术在没有实例化的情况下会造成15点伤害。它应该只在玩家真正投出时实例化。

我已经想到了静态场,但真实法术不能覆盖静态场。

然后我想到了一个单身模式,但是因为我将当前位置存储在我的法术中,这也不会起作用

这有什么标准模式吗?我只找到了原型模式,但是我需要一个它不会被继承的单例

1 个答案:

答案 0 :(得分:2)

您正在尝试为类应用继承(统一调用getDmg方法),避免对象实例化。正如您已经注意到的,这些需要静态字段和静态方法,但它们不适用于继承。我已经多次看过这种情况,并且不会那样。

我建议创建模板对象并使用它们来显示工具提示。例如:

public class SpellTooltip {

    private Map<Class<? extends Spell>, Spell> templates = new HashMap<>();

    {
        templates.put(Firebolt.class, new Firebolt());
        templates.put(Frostbolt.class, new Frostbolt());
    }

    public int getSpellDamage(Class<? extends Spell> clazz) {
        return templates.get(clazz).getDmg();
    }
}

实施可能因设计的复杂程度而异。按原样使用,您应该始终记住向地图添加新类型。