Цитирование PoEAA on Registry Pattern:
Если вы хотите найти объект, как правило, начинаются с другим объектом, который имеет связь с ним, а также использовать ассоциацию для перехода к ней. Таким образом, если вы хотите найти все заказы для клиента, вы начинаете с объекта клиента и используете для этого метод, чтобы получить заказы. Однако в некоторых случаях у вас не будет подходящего объекта для начала. Вы можете узнать идентификационный номер клиента, но не иметь ссылку. В этом случае вам нужен какой-то метод поиска - искатель, но остается вопрос: как вы добираетесь до искателя?
Основная причина, почему я использую реестр (когда я использую его) это потому, что она создает легкодоступную область применения. С реестром мне не нужно помещать объекты во всем глобальном пространстве; только сам реестр является глобальным. Это удобно для поиска все, что я брошена в реестр отовсюду, в том числе модели:
- Zend_Cache, Zend_Translate, важных приложений путей и т.д.
Однако так же, как и с Одиночки, реестр часто нахмурился. Вот article by Brandon Savage with some thought about why not to use the Registry. Основные аргументы против реестра являются
- это делает блок-тестирование сложнех
- неопытных кодеры могут бросить слишком много в ней и не заботиться о правильном дизайне
Те, кто голосует против Реестра обычно выступают за использование Dependency Injection, хотя следует отметить, что вы также можете ввести реестр, как только вы получите его экземпляр. У вас нет Inversion of Control, хотя, поскольку используемый объект будет тянуть то, что нужно от реестра. Однако использование реестра как локатора сервисов является допустимым.
См. Это article by Martin Fowler about ServiceLocator vs. Dependency Injection.
Как указано в комментариях к вашему вопросу, Zend_Registry
не является строгим Singleton. Вы можете создать несколько экземпляров, где это необходимо, в дополнение к использованию глобального экземпляра, который вы получаете с помощью Zend_Registry::getInstance()
. Таким образом, объекты могут иметь свой собственный реестр. Но при использовании Registry этот способ - это просто прославленный ArrayObject.
Заключительное примечание: как и все шаблоны проектирования, используйте его, если применимо к вашей проблеме.
Вы должны отличать 'Zend_Registry' от' Zend_Registry :: getInstance() '-singelton. Сам класс используется внутри ZF, не будучи глобальным, поэтому «Zend_Registry'! = Global. – chelmertz