我有一个存在的怀疑。我在一些博客(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;
}
}
答案 0 :(得分:1)
基本上我认为根据Service-Locator模式实现你的实现没有问题,除了没有缓存策略&如某些来源所述,使用单一访问方法而不是为每项服务设置唯一的getter / setter。 This可能是一个更明确的例子。
但它看起来像terrible模式。有什么需要呢?正如您的source建议的那样,它是一种包含一组工作类(实现公共接口)的方法,并且在不使用Singletons的情况下向客户端公开。
在扩展能力方面,我根本不认为这是一个很好的解决方案。当你必须添加更多服务时会发生什么?你必须
看起来非常糟糕。
如果您有一组向客户端公开相同功能的服务(即实现相同的接口),那么公开它们保留常见行为的最佳方法是
模式。