Factory шаблон в Python
В настоящее время я реализую шаблон дизайна Factory в Python, и у меня есть несколько вопросов.
-
Есть ли способ предотвратить прямое создание конкретных конкретных классов? Например, если у меня есть VehicleFactory, который порождает транспортные средства, я хочу, чтобы пользователи просто использовали этот factory, и не позволяли кому-либо случайно создавать экземпляр Car() или Truck() напрямую. Я могу исключить исключение из init(), но это также означает, что Factory не может создать экземпляр этого файла...
-
Мне кажется, что фабрики становятся привыкание. Похоже, что все должно стать Factory, чтобы при изменении внутренней реализации коды клиентов не изменились. Мне интересно узнать, когда возникает настоятельная необходимость использования заводов, и когда это нецелесообразно использовать. Например, у меня может быть класс Window, и теперь есть только один из этого типа (нет PlasticWindow, ReinforcedWindow или что-то в этом роде). В этом случае, должен ли я использовать Factory для клиента для создания окна, на всякий случай, если бы я мог добавить в будущем больше типов Windows?
-
Мне просто интересно, есть ли обычный способ вызвать фабрики. Например, теперь я называю свой Автомобиль Factory как Транспортные средства, поэтому коды будут выглядеть так, как Vehicle.create(...). Я вижу много учебников, которые делают это как VehicleFactory, но я нахожу его слишком длинным, и он также демонстрирует реализацию.
EDIT: То, что я подразумевал под "раскрытием реализации", заключается в том, что он позволяет людям знать, что это factory. Я чувствовал, что клиенту не нужно знать, что это factory, а скорее как некоторый класс, который может возвращать вам объекты (что, конечно, есть Factory, но, возможно, нет необходимости явно указывать клиентам это?). Я знаю, что коды сур легко раскрываются, поэтому я не имел в виду "разоблачение того, как функциональные возможности реализованы в исходных кодах".
Спасибо!
Ответы
Ответ 1
- Не выставляйте класс (например, сделайте его закрытым
__MyClass
, или очевидно, что вы не хотите, чтобы он использовался напрямую _MyClass
). Таким образом, он может быть создан только через функцию factory.
- Возможно, вам следует рассмотреть использование аргументов ключевых слов и наследование. Похоже, вы можете игнорировать их, что, как правило, уменьшит вашу зависимость от сложных фабрик (честно говоря, я редко нуждался в фабриках).
- В Python вы не можете легко защитить себя от демонстрации реализации, это противоречит Zen of Python. (То же самое на любом языке, определенный человек может получить то, что они хотят в конечном итоге). В лучшем случае вы должны попытаться убедиться, что пользователь вашего кода случайно не ошибается, но никогда не должен знать, что конечный пользователь может решить с помощью вашего кода. Не делайте его запутанным и трудным для работы.
Ответ 2
Будь Pythonic. Не переуплотывайте свой код с помощью "корпоративного" языка (например, Java), который добавляет ненужные уровни абстракции.
Ваш код должен быть простым и интуитивно понятным. Вам не нужно делегировать другой класс для создания экземпляра другого.
Ответ 3
Есть ли способ предотвратить прямое создание конкретных конкретных классов?
Почему? Являются ли ваши программисты злобными социопатами, которые отказываются следовать правилам? Если вы предоставляете factory - и factory делает то, что нужно людям - тогда они будут использовать factory.
Вы не можете "предотвратить" что-либо. Запомнить. Это Python - у них есть источник.
Должен ли я использовать factory для клиента для создания окна, на всякий случай, если я могу добавить в будущем больше типов Windows?
Мех. Ни хорошего, ни плохого. Это может стать громоздким для управления всеми сведениями об иерархии классов и factory.
Добавление factory не сложно. Это Python - у вас всегда есть источник - вы можете использовать grep
, чтобы найти конструктор класса и заменить его factory, когда вам нужно.
Поскольку вы можете использовать grep
для поиска и исправления своих ошибок, вам не нужно заранее планировать такие вещи как можно больше на Java или С++.
Я вижу много учебников, которые делают это как VehicleFactory, но я нахожу его слишком длинным, и он также демонстрирует реализацию.
"Слишком долго"? Он так редко используется, что это едва ли имеет значение. Используйте длинные имена - это помогает другим людям понять, что вы делаете. Это не Code Golf, где выигрывает наименьшее количество нажатий клавиш.
"раскрывает реализацию"? Во-первых, Он ничего не раскрывает. Во-вторых, это Python - у вас всегда есть источник - все уже открыто.
Прекратите так много думать о профилактике и конфиденциальности. Это не полезно.