У меня есть вопрос относительно реализации Factory Method в Java и Python.
Предположим, я хочу смоделировать 2 вида животных - собак и кошек и раскрыть фабричный метод их создания.
Как я понял, лучшая практика реализации на Java будет:
abstract class Animal{
public abstract void sound();
}
public class Dog extends Animal{
public void sound(){
System.out.println("Woof");
}
}
public class Cat extends Animal{
public void sound(){
System.out.println("Maw");
}
}
class AnimalFactory {
//use getShape method to get object of type shape
public Animal getAnimal(String animalType){
if(shapeType == null){
return null;
}
if(animalType.equalsIgnoreCase("Dog")){
return new Dog();
} else if(animalType.equalsIgnoreCase("Cat")){
return new Cat();
}
return null;
}
}
Однако на Python это будет что-то вроде этого ( source ):
class Animal(ABC):
@abstractmethod
def sound():
pass
class Dog(Animal):
def sound():
print('Woof')
class Cat(Animal):
def sound():
print('Maw')
class AnimalFactory():
@staticmethod
def getAnimal(typ):
targetclass = typ.capitalize()
return globals()[targetclass]()
На мой вопрос:
Кажется, что, поскольку я использую globals()
на Python, я могу фактически использовать AnimalFactory в Python для создания любого произвольного класса, который в таблице символов во время выполнения, который принимает нулевые аргументы, в отличие от реализации Java который явно проверяет имя класса.
Это плохая практика или просто "питонский путь"?
Спасибо.
Edit:
Я хочу уточнить, почему я не чувствую себя комфортно с кодом Python:
Предположим, я хочу написать другой класс Factory для другой группы классов, он будет иметь ту же реализацию, что и Animal, и теоретически я мог бы даже использовать точный класс Factory.
Я знаю, что могу рассердить некоторых людей из-за следующего утверждения, но я чувствую, что поведение 'утиной типизации' и отсутствие формального явного контракта в коде являются корнем проиллюстрированной проблемы и болезней Python в большие девелоперские проекты.