Zhi*_*lav 3 java oop design-patterns
假设我有一个名为Human
in的类ProjectA
。它CreatureBuilder
在同一个项目的类中被实例化。
现在我想创建一个Cyborg
在不同项目中调用的新类,即在ProjectB
. ProjectB
有ProjectA
它的进口,但ProjectA
对ProjectB
.
Cyborg extends Human
,并且还必须由CreatureBuilder
of实例化ProjectA
(因此,Cyborg
位于 中ProjectB
,我调用CreatureBuilder
fromProjectB
来实例化Cyborg
,但CreatureBuilder
位于 中ProjectA
,以及我的Human
类)。
我需要一个逻辑来创建一个Human
whenCreatureBuilder
实例化 from ProjectA
,并创建一个Cyborg
whenCreatureBuilder
实例化 from ProjectB
。
我认为可以通过getCreature()
在ProjectA
. 此方法将在ProjectB
to 中被覆盖return new Cyborg
,然后传回CreatureBuilder
of 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 次 |
最近记录: |