如何通过单例实例方法返回不同的类型

时间:2014-08-20 13:03:47

标签: java

如何在班级承包商中返回另一个班级实例? 我的伪代码是:

class test
{
    private test() {}

    public static test getInstance() 
    {
        if(Condition)
        {
            return new otherClass();
        }
        else
        {
            return new test();
        }
    }
}

2 个答案:

答案 0 :(得分:3)

getInstance()方法的返回类型必须反映您可以返回的所有类类型的常见类型,即它将是超类型公共接口< / em>所有这些类共享。

e.g。

public Vehicle getInstance() {
   if (...) {
     return new Car();
   }
   else {
     return new Bus();
    }
}

因此,在上文中,CarBus都来自VehicleVehicle可以是超类或接口)。否则,将违反方法返回类型与返回的内容之间的契约。请注意,您可以在继承层次结构中选择任何超类型 - 两者共有的任何内容(如果您返回Object或类似简单的东西,您无法在不强制转换的情况下使用该对象,这是一个符号那个东西在你的设计中是不对的)

您的主叫代码只会期望并收到Vehicle(并不关心它是Car还是Bus

   Vehicle v = Factory.getInstance();
    v.turnIgnitionOn();
    v.drive();

有关详细信息,请参阅this article。有用的是,它使用与我上面详述的相同的Vehicle抽象。

答案 1 :(得分:0)

首先:java中的类以大写字母开头(按照惯例)

一般来说,父母明确地构建它的儿子是一种不好的做法,但你可以做的是找一个工厂,为你建造它,以便儿子&#34;不会由父母建造。

工厂可以从外部源(道具文件ETC)加载或在getInstance签名中给出,在这种情况下,它不必是该类中的成员。

请注意,工厂必须能够构建您的类,因此它必须是Test的子类或在同一个包中,无论是构造函数必须受到保护还是您必须提供受保护的建筑方法......

以下示例显示了两种方法,在第一种情况下,逻辑在&#34;测试&#34;在另一个逻辑在工厂里,两个都有他们的缺点和优点,我会选择第一个,因为它将逻辑封装在一个更正确的&#34;方式...

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();
    }
}