Основным преимуществом первой модели перед второй является то, что называется «отложенной инициализацией». Во втором примере, как только вызывается SetLocator, у вас должен быть экземпляр IServiceLocator, загруженный в память и готовый к работе. Если такие экземпляры дороги в создании и / или создании вместе с кучей других объектов одновременно (как при запуске приложения), будет хорошей идеей попытаться отложить фактическое создание объекта, чтобы уменьшить заметные задержки для пользователя. Кроме того, если зависимость не может использоваться зависимым классом (скажем, она нужна только для определенных операций, а класс может выполнять другие действия, не требующие зависимости), было бы бесполезно создавать ее экземпляр.
Решение состоит в том, чтобы предоставить «фабричный метод» вместо фактического экземпляра. Когда экземпляр действительно необходим, вызывается фабричный метод, и экземпляр создается в последний момент, прежде чем его использовать. Это сокращает время загрузки внешнего интерфейса и позволяет избежать создания ненужных зависимостей.