Как я могу расширить классы в шаблоне Factory Method в Java - PullRequest
0 голосов
/ 21 мая 2018

Я новичок в шаблонах проектирования, и теперь я изучаю шаблон фабричного метода.Я пытаюсь сделать пример, используя животных.

У меня есть интерфейс Animal с двумя методами: дышать и ходить.Реализуя этот интерфейс, у меня есть два класса, Giraffe и Flamingo.

Следуя шаблону, у меня есть две фабрики, одна для Giraffes и одна для Flamingo и основной класс, подобный этому:

if (color.equals("yellow")) {
  factory = new GiraffeFactory();
} else {
  factory = new FlamingoFactory();
}

Animal animal = factory.createAnimal();
animal.breathe();
animal.walk();

Thisработает отлично, но теперь я понимаю, что фламинго могут летать.Я не хочу включать этот метод в интерфейс Animal, потому что Жирафы не могут.

Как я могу вызвать этот новый метод только в экземплярах Flamingo Animal?Является ли бросок единственным решением?Или этот шаблон только для объектов, которые имеют те же методы из своего интерфейса?

((Flamingo) animal).fly();

Большое вам спасибо.

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Вы можете создать другой интерфейс под названием WingedAnimal, который расширяет Animal.

public interface WingedAnimal extends Animal { 
   public void fly();
}

public class Flamingo implements WingedAnimal {
   @Override
   public void breath() {}
   @Override
   public void walk() {}
   @Override
   public void fly() {}
}

Затем напишите этот код при создании экземпляра Flamingo:

WingedAnimal animal = (Flamingo) factory.createAnimal();

Ваш код animal.fly () будет работать отлично.

0 голосов
/ 21 мая 2018

Что ж, использование этого паттерна не имело бы большого смысла, суть в том, что вы не знаете, какую реализацию Animal вы получите (разделение ответственности), так что было бы полным анти-паттерном использоватьзнания.Вы можете создать новый интерфейс Winged или что-то еще, и заставить Flamingo его реализовать.Тогда вы всегда можете проверить.помните, что летучие мыши также летают, думая об имени;)

if (animal instanceof Winged) {
    Winged winged = (Winged) animal;
    winged.fly();
}
...