1

当它与继承一起使用时,我遇到了工厂模式的问题,

这是我的代码

public class Animal {
  public int numberOfLegs() { return 2 ;}
}

public class Cat extends Animal {
  public String getSound() {return "Maaaw";}
}
public class Dog extends Animal {
  public String getSound() {return "woof";}
}

public class AnimalFactory {
  public Animal getAnimal(String name){
    Animal an= null ;
    if(name=="cat"){an = new Cat();}
    else if(name=="dog"){an=new Dog();}
    return an ;
  }
}

public class FactoryDemo {

  public static void main(String[] args) {
    AnimalFactory anmF=new AnimalFactory();
    Animal anm=anmF.getAnimal("cat") ;
    System.out.println("legs : "+anm.numberOfLegs()); // working fine
    System.out.println("sound : "+anm.getSound());    // giving error
  }
}

当我运行它时,我无法使用该getSound()方法。它给出了一个错误。

Animal如果我将类定义为抽象类,这会很好,
但我想如何处理工厂模式这样的情况。

4

3 回答 3

8

您需要为 getSound 添​​加一个抽象方法

public abstract class Animal {
    public int numberOfLegs() { return 2 ;}
    public abstract String getSound();
}
于 2012-12-08T13:28:58.770 回答
2

将您的代码更改为:

public abstract class Animal {
    public int numberOfLegs() { 
        return 2;
    }

    public abstract String getSound();
}


public class Cat extends Animal {
    public String getSound() {
        return "Maaaw";
    }
}

public class Dog extends Animal {
    public String getSound() {
        return "woof";
    }
}

public class AnimalFactory {
    public Animal getAnimal(String name) {

        Animal an = null;
        if ("cat".equals(name)) {
            an = new Cat();
        } else if ("dog".equals(name)) {
            an = new Dog();
        } 
        return an;
     }
}

您应该添加抽象方法,并在您的工厂方法中使用等于,而不是在对象上使用== 。

于 2012-12-08T13:44:53.317 回答
1

您包含的代码与工厂完全不同。如果您参考工厂方法模式,那么您作为 OP 的一部分实现的是不正确的实现。有两种“工厂”代码设计,一种是我之前指出的工厂方法模式(你的代码肯定不是那个)和有效 Java 书中推荐的工厂,这是 Java JDK 的首选设计,即valueOforcreate*方法.

于 2012-12-09T13:50:13.277 回答