2016-09-23 73 views
1

我有一個存在的懷疑。我在一些博客中看到了C++中ServiceLocator模式的實現(Service Locator)。所以,我試圖在Java SE上擴展相同的實現(沒有任何其他輔助框架)。請參閱下面的代碼。這是在java中ServiceLocator模式的有效實現嗎?

我的問題:這是在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

您知道[java.util.ServiceLoader類](http://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html),對吧?如果您出於學術原因想要這麼做,那麼服務定位器的要點是要麼有一個定義好的算法來發現特定類型的服務,要麼有一個公共註冊服務,圖書館可以使用它註冊本身。你的代碼看起來都沒有。 – VGR

+0

存在的疑問?聽起來相當嚴重... – shmosel

+0

嗨@shmosel,只是一種說法,我對此有許多疑問,沒有人會爲此而死。感謝您的關注。 – Ariel

回答

1

基本上我根據服務的Locator模式看沒有問題,您的實施方式中,比不存在緩存策略&的其他使用單個接入方式,而不是具有獨特getter/setter方法針對每個服務所解釋在某些來源。 This可能是一個更清晰的例子。

但它看起來像一個terrible模式。那需要什麼?正如你的source所建議的那樣,這是一種包含一組工作類(實現一個通用接口)的方法,並且在不使用Singletons的情況下向客戶公開。

我並不認爲這是一個很好的解決方案。當你必須添加更多的服務時會發生什麼?你必須

  • 添加越來越多的方法(以自己的方式)
  • 重現所有的if-else用於定位的任何服務(如在我把源解釋)梯子

這看起來很可怕。

如果你有一組被暴露相同的功能給客戶(即實現相同的接口)的服務,最好的方式來顯示它們保留了共同的行爲是任何一個

模式。

相關問題