实例化扩展类或其父类(视情况而定)

Zhi*_*lav 3 java oop design-patterns

假设我有一个名为Humanin的类ProjectA。它CreatureBuilder在同一个项目的类中被实例化。

现在我想创建一个Cyborg在不同项目中调用的新类,即在ProjectB. ProjectBProjectA它的进口,但ProjectAProjectB.

Cyborg extends Human,并且还必须由CreatureBuilderof实例化ProjectA(因此,Cyborg位于 中ProjectB,我调用CreatureBuilderfromProjectB来实例化Cyborg,但CreatureBuilder位于 中ProjectA,以及我的Human类)。

我需要一个逻辑来创建一个HumanwhenCreatureBuilder实例化 from ProjectA,并创建一个CyborgwhenCreatureBuilder实例化 from ProjectB

我认为可以通过getCreature()ProjectA. 此方法将在ProjectBto 中被覆盖return new Cyborg,然后传回CreatureBuilderof ProjectA。还有其他建议吗?您认为最好的解决方法是什么?我可以改用反射 API 吗?

干杯!

Spo*_*ted 5

爪哇 8

CreatureBuilder可以通过请求供应商将生物的创建委托给调用者。

public class CreatureBuilder {
    public Creature getCreature(Supplier<Creature> creatureSupplier)
    {
        //do some unknown things
        return creatureSupplier.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

来自 ProjectA 的使用

public class ProjectA {
    public static void main(String[] args) {
        Creature A = new CreatureBuilder().getCreature(Human::new);
    }
}
Run Code Online (Sandbox Code Playgroud)

来自 ProjectB 的使用

public class ProjectB {
    public static void main(String[] args) {
        Creature B = new CreatureBuilder().getCreature(Cyborg::new);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你不是被迫的,永远不要使用反射。

爪哇 7

如果您坚持使用 Java 7,则原理保持不变,只是它更冗长了一些。

您必须声明并使用您自己的类似供应商的接口

public interface CreatureSupplier {
    Creature get();
}

public class CreatureBuilder {
    public Creature getCreature(CreatureSupplier creatureSupplier)
    {
        //do some things
        return creatureSupplier.get();
    }
}
Run Code Online (Sandbox Code Playgroud)

用法有点冗长

public class ProjectA {
    public static void main(String[] args) {
        Creature A = new CreatureBuilder().getCreature(new CreatureSupplier() {
            @Override
            public Creature get() {
                return new Human();
            }
        });
    }
}

public class ProjectB {
    public static void main(String[] args) {
        Creature B = new CreatureBuilder().getCreature(new CreatureSupplier() {
            @Override
            public Creature get() {
                return new Cyborg();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

而且……就是这样,您的行为与 Java 8 中的行为相同。