私はBlochのEffective Java book [1]を読んでいて、次のSPIの例に出くわしました:
//Service interface
public interface Service {
//Service specific methods here
}
//Service provider interface
public interface Provider {
Service newService();
}
//Class for service registration and access
public class Services {
private Services(){}
private static final Map<String, Provider> providers =
new ConcurrentHashMap<String, Provider>();
public static final String DEFAULT_PROVIDER_NAME = "<def>";
//Registration
public static void registerDefaultProvider(Provider p) {
registerProvider(DEFAULT_PROVIDER_NAME, p);
}
public static void registerProvider(String name, Provider p) {
providers.put(name, p);
}
//Access
public static Service newInstance() {
return newInstance(DEFAULT_PROVIDER_NAME);
}
public static Service newInstance(String name) {
// you get the point..lookup in the map the provider by name
// and return provider.newService();
}
これは私の質問です: なぜ Provider インターフェースが必要なのですか? Service(s) 自体を簡単に登録することはできませんでしたか? たとえば、Service 実装のマップを維持し、検索したときにインスタンスを返すことはできませんでしたか? なぜ追加の抽象化レイヤーが必要なのですか?
おそらく、この例はあまりにも一般的です。要点を説明するための「より良い」例も素晴らしいでしょう。
[1] 第 2 版、第 2 章。第 1 版の例では、サービス プロバイダー インターフェイスについて言及していません。