Я должен создать объект на основе конкретной ситуации. Я читал, что решением может быть Factory Pattern, но в моем случае у него много недостатков.
Например: у меня есть приложение, которое управляет животными. В какой-то момент клиент дает мне список животных, которых нужно создать. Решение с использованием фабричного шаблона должно быть:
//PRODUCTS
public interface Animal {
String getCall();
}
public class Dog implements Animal {
public String getCall() {
return "Bau";
}
}
public class Cat implements Animal {
public String getCall() {
return "Miao";
}
}
public class Cow {...}
public class Rooster{...}
public enum AnimalEnum {
Cat, Dog, Cow, Rooster
}
//FACTORY
public class AnimalFactory {
public Animal getAnimal (AnimalEnum type){
Animal retval = null;
switch (type){
case Cat:
retval = new Cat();
break;
case Dog:
retval = new Dog();
break;
case Cow:[...]
case Rooster[...]
}
return retval;
}
}
На мой взгляд, это запах кода. Проблема в кейсе-выписке, которую я должен написать, чтобы проверить, какое животное хочет клиент. Кроме того, если в будущем я захочу создать новый объект «Тигр», мне придется изменить все фабричные классы.
Мой вопрос: есть ли способ избежать этой ситуации? Есть ли шаблон, который позволяет мне создавать объект на основе другого параметра без такого «каскадного if\case-of»?
Я думал, использовать шаблон команды, но в конце у меня все еще есть такая ситуация.