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

时间:2016-09-23 19:27:14

标签: java design-patterns service-locator

我有一个存在的怀疑。我在一些博客(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;
}

}

1 个答案:

答案 0 :(得分:1)

基本上我认为根据Service-Locator模式实现你的实现没有问题,除了没有缓存策略&如某些来源所述,使用单一访问方法而不是为每项服务设置唯一的getter / setter。 This可能是一个更明确的例子。

但它看起来像terrible模式。有什么需要呢?正如您的source建议的那样,它是一种包含一组工作类(实现公共接口)的方法,并且在不使用Singletons的情况下向客户端公开。

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

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

看起来非常糟糕。

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

模式。