Я мог бы что-то упустить, но мне не нравится этот шаблон.
У вас уже есть фабрики для Circle
и Square
- Circle
и Square
.:)
Код в вашем вопросе излишне жестко кодирует имена классов в factory
, а затем проходит через некоторые дополнительные циклы, получая имена подклассов Shape
и затем вызывая factory
с этими именами.
Более прямой способ создания списка shapes
:
types = Shape.__subclasses__()
shapes = [random.choice(types)() for _ in range(7)]
У меня есть ситуация, когда мне могут быть заданы несколько геометрий.Это упрощенный пример, но я получаю ответ JSON с различными геометриями, и вместо того, чтобы писать несколько операторов if несколько раз, я подумал, что использование Factory может уменьшить проблему: поэтому Shape (JSON) -> Circle or Shape (JSON) - Квадрат
Это не оправдывает factory
, как это здесь закодировано.Вы можете иметь простой словарь, например
classes = {'Circle': Circle, 'Square': Square, ...}
, или, возможно, создать его динамически с помощью
classes = {cls.__name__:cls for cls in Shape.__subclasses__()}
, а затем вызвать classes[some_string]()
для создания экземпляра.Вы даже можете динамически создавать экземпляр класса по строковому имени , используя getattr
.