Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带继承的工厂模式_Java_Oop_Design Patterns - Fatal编程技术网

Java 带继承的工厂模式

Java 带继承的工厂模式,java,oop,design-patterns,Java,Oop,Design Patterns,当工厂模式与继承一起使用时,我遇到了一个问题 这是我的密码 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 "wo

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

这是我的密码

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
类定义为抽象类,

但我想知道如何处理工厂模式这样的情况

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

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

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

public abstract class Animal {
    public int numberOfLegs() { return 2 ;}
    public abstract String getSound();
}
将代码更改为:

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;
     }
}
您应该添加抽象方法,并在factory方法中使用equals,而不是在对象上使用==。

将代码更改为:

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

您应该添加抽象方法,并在factory方法中使用equals,而不是在对象上使用==。

您包含的代码与factory完全不同。如果您参考then,那么您在OP中实现的是不正确的实现。有两种“工厂”代码设计,一种是我前面提到的工厂方法模式(你的代码肯定不是那样),另一种是《有效的Java》一书中推荐的工厂,这是Java JDK的首选设计,即
valueOf
create*
方法

您包含的代码与工厂完全不同。如果您参考then,那么您在OP中实现的是不正确的实现。有两种“工厂”代码设计,一种是我前面提到的工厂方法模式(你的代码肯定不是那样),另一种是《有效的Java》一书中推荐的工厂,这是Java JDK的首选设计,即
valueOf
create*
方法

这有助于了解您得到的错误。如果你认为所有动物都应该有声音,那么getSound()方法应该是Animal类的一部分。它与工厂模式没有任何关系。它有助于了解您得到的错误。如果你认为所有动物都应该有声音,那么getSound()方法应该是Animal类的一部分。它与工厂模式没有任何关系。谢谢,是的,它解决了问题,但我想知道,在不将Animal类定义为抽象类的情况下,有没有办法做到这一点?您需要提供
getSound()
的默认实现。谢谢,是的,它解决了问题,但是我想知道有没有办法在不将动物类定义为抽象类的情况下做到这一点?您需要提供
getSound()
的默认实现。谢谢,是的,它解决了这个问题,但是我想知道有没有办法在不将动物类定义为抽象类的情况下做到这一点?当然。只需在animal中为getSound添加一个实现并删除abstract关键字。谢谢,是的,它解决了这个问题,但我想知道有没有办法不将animal类定义为abstract?当然可以。只需在animal中为getSound添加一个实现并删除abstract关键字。派对有点晚了@天行者,为什么你认为它和工厂一点也不像?如果AnimalFactory将实现AnimalFactory接口,这不正是工厂方法模式吗@天行者,为什么你认为它和工厂一点也不像?如果AnimalFactory将实现AnimalFactory接口,这不正是工厂方法模式吗?