[ Примечание . Будьте очень осторожны при разделении «Календаря» на собрание событий, а «Событие» - на одно событие в календаре. В вашем вопросе кажется, что может быть некоторая путаница.]
Существует множество вариантов шаблона проектирования фабрики.
Автономная удобная функция (например, CalendarMaker (данные))
Отдельный класс (например, CalendarParser), который создает целевой класс (Календарь).
Метод уровня класса (например, Calendar.from_string).
У них разные цели. Все питоники, вопросы такие: "что вы имеете в виду ?" и "что может измениться?" Смысл это все; изменение важно.
Удобные функции - Pythonic. Такие языки, как Java, не могут иметь свободно плавающих функций; Вы должны обернуть одинокую функцию в классе. Python позволяет вам иметь одиночную функцию без издержек класса. Функция уместна, когда ваш конструктор не имеет изменений состояния или альтернативных стратегий или какой-либо памяти о предыдущих действиях.
Иногда люди определяют класс и затем предоставляют вспомогательную функцию, которая создает экземпляр класса, устанавливает обычные параметры для состояния и стратегии и любой другой конфигурации, а затем вызывает единственный соответствующий метод класса. Это дает вам возможность сохранения состояния класса и гибкость автономной функции.
Используется шаблон метода уровня класса, но он имеет ограничения. Во-первых, он вынужден полагаться на переменные уровня класса. Поскольку это может сбивать с толку, сложный конструктор как статический метод сталкивается с проблемами, когда вам необходимо добавить функции (например, отслеживание состояния или альтернативные стратегии). Убедитесь, что вы никогда не собираетесь расширять статический метод.
Во-вторых, он более или менее не имеет отношения к остальным методам и атрибутам класса. Этот вид from_string
является лишь одним из многих альтернативных кодировок для ваших объектов Календаря. Возможно, у вас есть from_xml
, from_JSON
, from_YAML
и так далее. Ничто из этого не имеет ни малейшего отношения к тому, что такое Календарь или что он делает. Эти методы все о том, как Календарь кодируется для передачи.
В зрелых библиотеках Python вы увидите, что фабрики отделены от того, что они создают. Кодирование (в виде строк, XML, JSON, YAML) подвержено большому или меньшему количеству случайных изменений. Однако существенная вещь редко меняется.
Разделите две проблемы. Держите кодировку и представление как можно дальше от состояния и поведения.