【发布时间】:2012-07-07 18:09:59
【问题描述】:
我正在阅读 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 接口?难道我们不能自己轻松地注册服务吗?维护服务实现的映射,然后在查找时返回实例?为什么要增加额外的抽象层?
也许这个例子太笼统了——任何“更好”的例子来说明这一点也很好。
[1]Second edition,第 2 章。第一版示例未提及服务提供者接口。
【问题讨论】:
标签: java design-patterns service-provider