Java 如何通过单例实例方法返回不同的类型
如何在类承包商中返回另一个类实例?Java 如何通过单例实例方法返回不同的类型,java,Java,如何在类承包商中返回另一个类实例? 我的伪代码是: class test { private test() {} public static test getInstance() { if(Condition) { return new otherClass(); } else { return new test(); }
我的伪代码是:
class test
{
private test() {}
public static test getInstance()
{
if(Condition)
{
return new otherClass();
}
else
{
return new test();
}
}
}
getInstance()
方法的返回类型必须反映您可以返回的所有类类型的公共类型,即它将是所有这些类共享的超类型或公共接口
e、 g
因此,在上面的例子中,Car
和Bus
都源自Vehicle
(Vehicle
可以是超类或接口)。否则,将违反方法返回类型和所返回内容之间的约定。请注意,您可以选择继承层次结构中的任何超级类型—这两种类型都通用的任何类型(如果您返回一个对象
,或者类似的简单化对象,如果不强制转换它,您就无法有效地处理该对象,这表明您的设计中存在一些不正确的地方)
您的呼叫代码只需要期望并接收一辆车辆
(而不关心它是汽车
还是公交车
)
有关更多信息,请参阅。有用的是,它使用了与我上面详述的相同的
工具
抽象。首先:java中的类以大写字母开头(按惯例)
一般来说,父母明确地构建其子是一种不好的做法,但你可以做的是让工厂为你构建它,这样“子”就不会由父母构建
工厂可以从外部源(props文件等)加载,也可以在getInstance签名中提供,在这种情况下,它不必是类中的成员
请注意,工厂必须能够构造您的类,因此它必须是Test的子类或在同一个包中,无论哪种方式,构造函数都必须受到保护,或者您必须提供一个在protected中构造的方法
下面的例子显示了两种方法,第一种是逻辑在“测试”类中,另一种是逻辑在工厂中,两者都有各自的优点和缺点,我将使用第一种方法,因为它以一种更“正确”的方式封装逻辑
返回新的OtherClass()
您必须在不同的行上更改getInstance方法的返回类型,为什么要这样做?对于您的代码,otherClass
必须是test
的子类,因为我需要在我的应用程序中使用覆盖系统,例如,对于每个客户端,我都有一个特殊的类。makeotherClass
(或@MarounMaroun建议的OtherClass
)extend
您的test
类。您能解释更多细节吗?public Object getInstance()呢OFC?你必须检查这个对象的类型。你可以考虑返回一个接口而不是一个对象,因此接口的实现可以在不同的类中针对不同的情况来完成。在你的答案中添加接口,这样就很清楚了。工厂类从测试类扩展了吗?看看我刚刚做的一个编辑。它可以是一个子类,也可以在同一个包中-无论哪种方式,测试的CTor都必须受到保护,或者它应该为构造提供一个受保护的方法。我想我不知道,我需要提供一个真实的示例:(你能帮我吗?你需要什么帮助?我认为我的解决方案不适合好的应用程序。是吗?你能在回复中插入工厂类代码吗?非常感谢你的合作
public Vehicle getInstance() {
if (...) {
return new Car();
}
else {
return new Bus();
}
}
Vehicle v = Factory.getInstance();
v.turnIgnitionOn();
v.drive();
class Test
{
private TestFactory factory = null
protected Test(...) {...}
public static Test getInstance()
{
if(Condition)
{
return factory.getOtherClass();
}
else
{
return factory.getTestClass();
}
}
public static Test getInstance2()
{
return factory.construct(Condition_Params);
}
}
public abstract class TestFactory {
public static Test getTestClass(){
return new Test();
}
public static Test getOtherClass(){
return new OtherTest();
}
}