我有一个api,它有一些基础实现。我有一个工厂,为客户提供该API的实例。
我想更改我的工厂以使其更通用,因此,如果将生成api的新实现并将其jar文件放入类路径中,工厂将理解它并且不需要任何更改。
答案 0 :(得分:4)
使用java SPI,服务提供商接口。
META-INF/services/my.package.MyInterface
中,列出了实现类。服务发现发生在ServiceLoader<T>
:
public static void main(String[] args) {
ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
for (MyInterface api : loader) {
api. ...
}
// Or take the first implementation:
MyInterface api = loader.iterator().next();
}
您可以在API jar中为该发现机制提供一个静态函数。
优点:
罐子示例
my.package.impl.MyImpl1
public class MyImpl1 implements MyInterface { ... }
答案 1 :(得分:0)
如果你想从理论开始。请阅读Dependency inversion principle。
在面向对象的编程中,依赖性反转原理指的是解耦软件模块的特定形式。当遵循该原理时,从高级策略设置模块到低级依赖模块建立的传统依赖关系被反转(即反转),从而使高级模块独立于低级模块实现细节。
一个。高级模块不应该依赖于低级模块。两者都应该取决于抽象。
B中。抽象不应该依赖于细节。细节应该取决于抽象。
这个原则颠倒了一些人对面向对象设计的思考方式,规定高级和低级对象必须依赖于相同的抽象。
依赖注入库
至于具体的实现,你有许多Java。特别针对Dependency Injection方法。 Spring Framework显然会浮现在脑海中。但您也可以查看Java EE Context and Dependency Injection。
界面注入
你也可以......