工厂不依赖于实施

时间:2015-06-10 11:27:31

标签: java factory

我有一个api,它有一些基础实现。我有一个工厂,为客户提供该API的实例。

我想更改我的工厂以使其更通用,因此,如果将生成api的新实现并将其jar文件放入类路径中,工厂将理解它并且不需要任何更改。

2 个答案:

答案 0 :(得分:4)

使用java SPI,服务提供商接口。

  • API jar - 提供一个单独的界面。
  • 提供者jar - 在jar中提供实现。你甚至可以在jar中放置几个​​实现。在文本文件META-INF/services/my.package.MyInterface中,列出了实现类。
  • 应用程序 - 在应用程序中,编译时不需要实现jar: 在maven范围运行时。

服务发现发生在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中为该发现机制提供一个静态函数。

优点:

  • 分离
  • 可能的几种实现
  • 实施的选择可以动态完成

罐子示例

  • XXX-api.jar文件
    • 我/包/ MyInterface.class
  • XXX-第一impl.jar中
    • META-INF /服务/ my.package.MyInterface
      • my.package.impl.MyImpl1
    • 我/包/ IMPL / MyImpl1.class
      • public class MyImpl1 implements MyInterface { ... }
  • myapp1.jar

答案 1 :(得分:0)

如果你想从理论开始。请阅读Dependency inversion principle

  

在面向对象的编程中,依赖性反转原理指的是解耦软件模块的特定形式。当遵循该原理时,从高级策略设置模块到低级依赖模块建立的传统依赖关系被反转(即反转),从而使高级模块独立于低级模块实现细节。

     

一个。高级模块不应该依赖于低级模块。两者都应该取决于抽象。

     

B中。抽象不应该依赖于细节。细节应该取决于抽象。

     

这个原则颠倒了一些人对面向对象设计的思考方式,规定高级和低级对象必须依赖于相同的抽象。

依赖注入库

至于具体的实现,你有许多Java。特别针对Dependency Injection方法。 Spring Framework显然会浮现在脑海中。但您也可以查看Java EE Context and Dependency Injection

界面注入

你也可以......

  1. 手动加载Jars:How should I load Jars dynamically at runtime?
  2. 使用接口注入Spring interface injection example(这个标题说Spring,但答案显示接口注入不需要Spring)