如何为子类使用相同的工厂方法?

时间:2011-07-14 14:31:02

标签: java factory

我需要一个对象B,但是当我执行'B.GetByID()'

时我得到一个对象A.
public class A 
{
    public A()
    {

    }

    public static A GetSelf()
    {
        return new A();
    }

    public static A GetByID()
    {
        return GetSelf();
    }
}


public class B extends A
{
    public B()
    {
        super();
    }


    public static B GetSelf()
    {
        return new B();
    }
}


B.GetByID(); //returns A, i need B

3 个答案:

答案 0 :(得分:12)

您只能通过 B GetByID()中创建B方法来执行此操作。虽然这有点难看......

基本上,您的B.GetByID()来电将被解析为A.GetByID();编译代码中的任何内容都不会表明它原来是B.GetByID(),并且GetSelf()中对GetByID()的调用无论如何都将被解析为A.GetSelf()

基本上,静态方法不允许以您希望的方式进行多态化。我建议你创建一个AFactory和一个BFactory子类,并使用 instance 方法以正常方式使用方法覆盖。

答案 1 :(得分:1)

您可以向GetByID添加B方法,如下所示:

public class B ... {

    public static B GetByID()
    {
        return GetSelf();
    }

}

答案 2 :(得分:0)

您的工厂方法(无论在哪个类中声明)都需要知道AB两者,然后决定要实例化哪个类。如果调用者知道它需要B,那么它无论如何都可以执行new B(),因此无论如何工厂方法都没有值。