Zhi*_*lav 3 java oop design-patterns
假设我有一个名为Humanin的类ProjectA。它CreatureBuilder在同一个项目的类中被实例化。
现在我想创建一个Cyborg在不同项目中调用的新类,即在ProjectB. ProjectB有ProjectA它的进口,但ProjectA对ProjectB.
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 吗?
干杯!
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)
如果你不是被迫的,永远不要使用反射。
如果您坚持使用 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 中的行为相同。
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |