使用继承时,我遇到了Factory模式的问题,
这是我的代码
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
类定义为Abstract类,则这将正常工作
但我想如何处理Factory模式这样的情况。
答案 0 :(得分:8)
您需要为getSound
添加一个抽象方法public abstract class Animal {
public int numberOfLegs() { return 2 ;}
public abstract String getSound();
}
答案 1 :(得分: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;
}
}
您应该添加抽象方法,并在工厂方法中使用 equals ,而不是在Objects上使用 == 。
答案 2 :(得分:1)
您包含的代码与工厂完全不同。如果您参考Factory Method Pattern那么,您作为OP的一部分实现的是不正确的实现。有两个“工厂”代码设计,一个是我之前指出的工厂方法模式(你的代码绝对不是那个)和工厂推荐的有效Java书籍,这是Java JDK的选择设计,即{{ 1}}或valueOf
方法。