这是 java 中 ServiceLocator 模式的有效实现吗?

Is this valid implementation of ServiceLocator pattern in java?

我有一个存在的疑问。我在一些博客 (Service Locator) 中看到了 C++ 中 ServiceLocator 模式的实现。因此,我试图在 Java SE 上扩展相同的实现(没有任何其他辅助框架)。请参阅下面的代码。

我的问题:这是 java 中 ServiceLocator 模式的有效实现吗?如果不是这种情况,java 中此模式的最简单(示例)实现可能是什么?

/**
 * Where MyService1 and MyService2 are interfaces.
 */
public final class MyServiceLocator {

private static MyService1 service1;

private static MyService2 service2;

private MyServiceLocator() {
    // No op
}

public static MyService1 getMyService1() {
    if (service1 == null) {
        throw new NullMyService1Exception();
    }
    return service1;
}

public static MyService2 getMyService2() {
    if (service2 == null) {
        throw new NullMyService2Exception();
    }
    return service2;
}

public static void provideService1(MyService1 service1) {
    // Initialize Service1
    ...
    MyServiceLocator.service1 = service1;
}

public static void provideService2(MyService2 service2) {
    // Initialize Service2
    ...
    MyServiceLocator .service2 = service2;
}

}

基本上,我认为根据服务定位器模式,您的实施没有任何问题,除了缺少缓存策略和使用单一访问方法,而不是像某些来源中解释的那样为每个服务设置唯一的 getters/setters。 This 可能是一个更清楚的例子。

但它看起来像 terrible pattern. What is the need of that? As your source suggests, it's a way to contain a set of worker classes (which are implementing a common interface), and expose to clients without using Singletons

就扩展能力而言,我根本不认为这是一个好的解决方案。当您必须添加更多服务时会发生什么?你必须

  • 添加越来越多的方法(以您的方式)
  • 重现所有用于定位任何服务的 if-else 阶梯(如我放置的源中所述)

看起来很糟糕。

如果您有一组服务向客户公开相同的功能(即实现相同的接口),公开它们并保留共同行为的最佳方法是

模式。