Service locator pattern

UML class diagram of the service locator pattern.

The service locator pattern is a design pattern used in software development to encapsulate the processes involved in obtaining a service with a strong abstraction layer. This pattern uses a central registry known as the "service locator", which on request returns the information necessary to perform a certain task. Proponents of the pattern say the approach simplifies component-based applications where all dependencies are cleanly listed at the beginning of the whole application design, consequently making traditional dependency injection a more complex way of connecting objects. Critics of the pattern argue that it is an anti-pattern which obscures dependencies and makes software harder to test.[better source needed]

Advantages

Disadvantages

Example

Consider a simple logging framework:

interface Logger {
    void log(String message);
}

class ConsoleLogger implements Logger {
    public void log(String message) {
        System.out.println("LOG: " + message);
    }
}

A service locator for such a system would be the following:

class LoggerServiceLocator {
    private static Logger logger = new ConsoleLogger();

    // Obtain the logger
    public static Logger getLogger() {
        return logger;
    }

    // Allow replacing a logger
    public static void registerLogger(Logger replacement) {
        logger = replacement;
    }
}

This allows the client application to not have to instantiate the logger directly, but rather obtain it through the provider:

Logger logger = LoggerServiceLocator.getLogger();
logger.log("Obtained logger from LoggerServiceLocator.");

See also

References

  1. ↑ Fowler, Martin. "Inversion of Control Containers and the Dependency Injection pattern".
  2. ↑ Seemann, Mark. "Service Locator is an Anti-Pattern". blog.ploeh.dk. Retrieved 2017-06-01.