Цитирование PoEAA в шаблоне реестра :
Когда вы хотите найти объект, вы обычно начинаете с другого объекта, который имеет ассоциацию с ним, и используете ассоциацию для перехода к нему. Таким образом, если вы хотите найти все заказы для клиента, вы начинаете с объекта customer и используете метод для получения заказов. Однако в некоторых случаях у вас не будет подходящего объекта для начала. Вы можете знать идентификационный номер клиента, но не иметь ссылки. В этом случае вам нужен какой-то метод поиска - искатель, но остается вопрос: как добраться до искателя?
Основная причина, по которой я использую реестр (когда я его использую) , заключается в том, что он создает легкодоступную область приложения. С реестром мне не нужно засорять объекты по всему глобальному охвату; только сам реестр является глобальным. Удобно искать все, что я бросил в Реестр отовсюду, включая модель:
- Zend_Cache, Zend_Translate, пути к важным приложениям и т. Д.
Однако, как и в случае с синглетонами, реестр часто вызывает недовольство. Вот статья Брэндона Сэвиджа с некоторыми соображениями о том, почему бы не использовать реестр . Основными аргументами против Реестра являются
- затрудняет юнит-тестирование
- неопытные программисты могут бросить в него слишком много и не заботиться о правильном дизайне
Те, кто голосует против Реестра, обычно выступают за использование Инъекции зависимостей , хотя следует отметить, что вы можете также внедрить Реестр, как только получите его экземпляр. Тогда у вас нет Inversion of Control , потому что использующий объект извлечет из реестра то, что ему нужно. Однако использование реестра в качестве локатора служб является верным подходом.
См. Эту статью Мартина Фаулера о ServiceLocator против внедрения зависимостей .
Как указано в комментариях к вашему вопросу, Zend_Registry
не является строгим синглтоном. Вы можете создать несколько экземпляров, где это необходимо, в дополнение к использованию глобального экземпляра, который вы получаете с Zend_Registry::getInstance()
. Таким образом, объекты могут иметь свой собственный реестр. Но при использовании Registry таким образом, это просто прославленный ArrayObject.
Последнее замечание: как и во всех шаблонах проектирования, используйте его, если применимо к вашей проблеме.