Я думаю, ответ @ lennart-regebro может быть немного неумышленно обманчивым. Это понятно, поскольку документы Zope немного расплывчаты. Я думаю, что ниже приведена правильная интерпретация, но я должен был проверить ее сам, чтобы убедиться.
В и компонент, и фабрика регистрация каждый последующий вызов getUtility после начальной регистрации вернет тот же экземпляр .
Разница в том, что метод компонента зарегистрирует ссылочный объект в качестве экземпляра утилиты, который будет возвращен, тогда как фабричный метод вызовет ссылочный объект и сохранит результат в качестве экземпляра утилиты, который будет возвращен.
Пример фабрики
Так, например, если у вас есть служебный класс, определенный следующим образом:
class MyUtility(object):
implements(IMyUtility)
...
регистрация его с помощью;
<utility factory=".my_module.MyUtility"/>
в момент выполнения zcml создаст экземпляр MyUtility и сохранит его для любых будущих вызовов getUtility;
> a = getUtility(IMyUtility)
> b = getUtility(IMyUtility)
> c = getUtility(IMyUtility)
> a is b is c
True
Обратите внимание, что мы могли бы зарегистрировать фабрику как функцию вместо класса, просто она должна быть чем-то, что при вызове без аргументов возвращает экземпляр вашей утилиты, которую вы хотите использовать.
Пример компонента
Эквивалентный пример с компонентом:
class MyUtility(object):
implements(IMyUtility)
...
my_module_instance_of_utility = MyUtility()
регистрация его с помощью;
<utility component=".my_module.my_module_instance_of_utility"\>
Это более или менее эквивалентно заводскому примеру. Единственное отличие состоит в том, что экземпляр, возвращенный в примере компонента, создается, когда my_module
импортируется чем-либо (включая механизм регистрации), тогда как при использовании фабрики экземпляр создается при выполнении конфигурации zcml, непосредственно перед тем, как он зарегистрирован , В обоих случаях последующие вызовы getUtility будут возвращать один и тот же экземпляр.
Не путать с IFactory
Ничего из этого не следует путать с IFactory, который предоставляет что-то, что может предоставлять вам новый экземпляр каждый раз, когда его запрашивают, но с немного другим API. См. этот документ для получения дополнительной информации о тех .