1

継承で使用する場合、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パターンのような状況をどのように処理するかを知りたいです。

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

抽象メソッドを追加し、オブジェクトで==を使用する代わりにファクトリ メソッドでequalsを使用する必要があります。

于 2012-12-08T13:44:53.317 に答える
1

あなたが含めたコードは、ファクトリーのようなものではありません。Factory Method Patternを参照すると、OP の一部として実装したものは正しくない実装です。2 つの「ファクトリー」コード設計があります。1 つは前に示したファクトリー メソッド パターン (あなたのコードは間違いなくそうではありません) と、Java JDK の選択の設計である、Effective Java book で推奨されているファクトリー、つまりvalueOforcreate*メソッドです。 .

于 2012-12-09T13:50:13.277 に答える