Я придерживаюсь мнения, что, вообще говоря, на самом деле нет такого понятия, как "плохой шаблон". При этом некоторые методы должны использоваться более экономно, чем другие, и понятие «глобальный» реестр часто бывает менее элегантным. Проблема с этим заключается в том, что зависимости между данными объектами обрабатываются с помощью адресации на основе имен, которая сродни простому использованию глобальных переменных, а не косвенной стратегии при наличии зависимостей - что обычно называют внедрение зависимости .
Как это может повлиять на повторное использование и гибкость программного обеспечения, на самом деле очень ясно. Рассмотрим своего рода обработчик запросов, который интегрируется с поставщиком OAuth2 для аутентификации. Если вы определяете объект с четко определенным интерфейсом для отправки запросов этому поставщику OAuth2, у вас есть возможность сменить поставщика в будущем, создав другой объект, который реализует тот же интерфейс.
Теперь, скажем, для обсуждения, ваша первая реализация должна получить доступ к Facebook. Но затем на следующей неделе вы принимаете решение о том, что вам также следует поддержать Yahoo, которая реализует OAuth2 способом, который более точно следует спецификации, чем Facebook, фактически используя JSON в запросе токена авторизации, а не пары имя-значение. И, кроме того, есть разные пары URL-адресов и ключей, и тому подобное, которые необходимо сохранить.
Что ж, если вы искали своего провайдера аутентификации по имени, используя шаблон реестра или шаблоны поиска служб, у вас сейчас есть проблема. Вам нужно либо скопировать код и внести в него незначительные изменения, чтобы вы могли поддерживать оба сразу, либо найти другое решение, такое как передача ключей и добавление хеш-таблиц во всех местах, чтобы найти все эти элементы и обнаружить эти отклонения. Между тем, если вы использовали внедрение зависимостей, вы можете просто создать другую реализацию вашего провайдера аутентификации, которая реализует небольшую дисперсию синтаксического анализа токена аутентификации, и создать новый экземпляр вашего обработчика запросов, который использует этот объект и уже имеет был протестирован, а затем разверните его в новом месте.
Переадресация спасла вашу работу, сократила объем необходимого кода и в конечном итоге сделала ваше программное обеспечение дешевле, лучше и быстрее.
С учетом сказанного, бывают случаи, когда эти два шаблона не являются непосредственно взаимозаменяемыми. Допустим, например, что вы создаете некий каркас, который присоединяет обработчики событий к узлам XML-документа. Вы описываете расположение узлов в XML-документе с помощью реализации CSS-селекторов в XPath или JQuery. Но для того, чтобы прикрепить обработчик события, вам также нужно обратиться к некоторому коду. Предпочтительно, вы будете ссылаться на некоторый метод некоторого объекта - ну, нет никакого способа найти этот «некоторый объект», не дав ему имя, поэтому теперь вам нужен локатор службы, чтобы вы могли искать вещи по имени. Но имейте в виду, что даже в этом примере ничто не указывает на то, что имя должно быть global .
Создание локального локатора службы или локального реестра, как вы его здесь называете, является разумным решением проблемы такого рода. Если в одном и том же приложении может быть два экземпляра реестра, некоторые из вышеупомянутых проблем повторного использования иногда могут быть смягчены.