2016-07-27 17 views
0

私のプロジェクトの1つでは、特定の問題を解決するためにFactoryデザインパターンを実装する必要があります。工場設計パターンとダイヤモンドOOPの問題

私は1つの親インターフェイスと2つの子インターフェイスを持っています。次の段階では、与えられた入力に基づいて特定のクラスのインスタンスを返すファクトリを作成する必要があります。

私の問題とサンプルダイアグラムについても説明している下のサンプルコードをご覧ください。

サンプルダイアグラム

enter image description here

サンプルコード

enum AnimalType{ DOG, CAT } 

Class Factory{ 
    public Animal getInstance(AnimalType animalType){ 
     Animal animal = null; 
     switch(animalType){ 
      case DOG: animal = new Dog(); 
       break; 

      case CAT: animal = new Cat(); 
       break; 
      default: 
       break; 
     } 
     return animal; 
    } 
} 

/*Actual Problem */ 
Animal animal = Factory.getInstance(AnimalType.DOG); 

    /* When I use any IDE like IntellijIdea or Eclipse it only provides eat() method after animal and dot (ie. animal.) */ 
animal.<SHOULD PROVIDE eat() and woof() from Dog> but it is only providing eat() 

この問題を克服するために、任意のアドバイスはありますか?または、この問題のために他のデザインパターンを検討する必要がありますか?

+0

犬ではなく動物として宣言されています。 「動物」を「犬」と宣言してから、試してみてください。 – ifly6

答えて

2

問題は工場出荷時のパターンと直接関係していません。 Animalと宣言し、Dogとして扱いたいとします。どのように作成するかは関係ありませんが、doggyメソッドを呼び出すにはDogにする必要があります。

これを解決する方法は多数あります。ここにはいくつかの選択肢があります。

  1. Animalの異なる拡張を作成するための別の方法があります。したがって、Animal getInstance(AnimalType type)の代わりに、Dog getDog()Cat getCat()の方法が工場で使用されます。工場がこれらのクラスをすべて意識する必要があることを考えると、これは私にとって最良の選択肢のようです。

  2. あなたの工場からAnimalインスタンスを引き続き返信しますが、「訪問者」パターンを使用して犬と猫を別々に扱います。

  3. instanceofを使用し、動物をイヌまたはネコとして扱うために使用する。ほとんどの状況では推奨されませんが、場合によっては適切です。

2

私はあなたの問題は"General OO"ない本当に程度Factoryデザインパターンに関連していると思います。 AnimalDogCat:それでは、あなたの3つのインターフェースを見てみましょう。 DogCatAnimalインタフェースを実装している、それは我々は彼らがAnimalの行動を尊重している作ることができるもの、彼らは違いの実装と全く同じ行動を持っていることを意味するものではありません。

例えば

  1. DogCatは同じ動作がeat()
  2. Dog存在しないwoof()振る舞いを持っている必要がありますCat
  3. Catにあなたが(デザインパターンの先頭に応じシンプルファクトリーを実装する際に、そのためDog

には存在しませんmiaw()行動を持っていますそれは実際のデザインパターンではなく、単にプログラミングのイディオムです)オブジェクトを作成して返すにはAnimalインターフェイスは、それはあなたが同じ動作をするAnimalとしてDogCateat()さを検討していることを意味します。あなたは私の意見では、あなたのコード

/*Actual Problem */ 
Animal animal = Factory.getInstance(AnimalType.DOG); 

    /* When I use any IDE like IntellijIdea or Eclipse it only provides eat() method after animal and dot (ie. animal.) */ 
animal.<SHOULD PROVIDE eat() and woof() from Dog> but it is only providing eat() 

にこのような代を行うことができない理由です、いくつかの可能な実装あります

  1. 簡単にするために、あなたが作成することができますが工場、1単純な2 あなたが知っている場合Dogおよびその他のためCat
  2. 何であるかをワットアリ、あなたがAnimalDogまたはCatをキャストした後、Abstract Factoryパターンを実装
  3. その機能を使用することができ、それが提供し、製品の家族(Dogを作成するための抽象インタフェースますCat)。

私はそれがあなたを助けることを願っています。

関連する問題