Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何实现算法库?_Java_Design Patterns_Repository_Repository Design - Fatal编程技术网

Java 如何实现算法库?

Java 如何实现算法库?,java,design-patterns,repository,repository-design,Java,Design Patterns,Repository,Repository Design,我有一套用Java实现的算法,并打包成jar文件。这些算法旨在供第三方访问。这些算法有几个变体。超时,新版本和新类型的算法将被添加到。同时,我不会强迫所有第三方使用新算法 我正在考虑为此实现一个简单的存储库系统。要求如下: 创建/删除回购协议,以便每个回购协议包含一组算法变体 一个repos中的算法可以同时运行serverl版本 新算法可以添加到回购协议中 有没有适合我要求的开源项目?或者有这样的问题的设计模式吗?例如,Apache Commons Lang通过在2.0和3.0版本之间更改包名来

我有一套用Java实现的算法,并打包成jar文件。这些算法旨在供第三方访问。这些算法有几个变体。超时,新版本和新类型的算法将被添加到。同时,我不会强迫所有第三方使用新算法

我正在考虑为此实现一个简单的存储库系统。要求如下:

  • 创建/删除回购协议,以便每个回购协议包含一组算法变体
  • 一个repos中的算法可以同时运行serverl版本
  • 新算法可以添加到回购协议中
  • 有没有适合我要求的开源项目?或者有这样的问题的设计模式吗?

    例如,Apache Commons Lang通过在2.0和3.0版本之间更改包名来解决此问题:
    org.apache.commons.lang
    变成了
    org.apache.commons.lang3

    我们已经删除了API中不推荐使用的部分,还删除了 一些被认为是薄弱或不必要的功能。所有这些都意味着 Lang 3.0不向后兼容

    为此,我们更改了包名,允许使用Lang3.0 与以前版本的Lang并肩运行,没有任何不好的方面 效果


    正如一些评论中所建议的那样,基于模式的解决方案将是声明接口和实现工厂:

    对于每个算法,您应该:

    • 声明自己的接口,它应该以一种保守的方式长期存在:尽管有新版本,但始终保留现有的API而不进行修改(因此旧代码可以始终使用它)。如果需要,添加新方法

    • 为要支持的每个版本编写实现代码。这种实现必须具有包可见性,并且它们可以共享同一个包,但每个包都有自己的名称,即corse

    • 然后,添加工厂以构建实现对象。此工厂应接收所需版本的参数:

    公共类MyFactory
    {
    公共MyInterface create(字符串版本)抛出VersionNotSupportedException{…}
    }
    
    关于对这个工厂进行编码,我还建议您在每个JAR中添加一个带有版本和实现类之间映射的
    META-INF/myfile
    ,以便
    MyFactory
    可以让它们全部执行:

    getClass().getClassLoader().getResources("META-INF/myfile");
    
    更进一步,您可以声明一个通用工厂,用于参数化返回对象的类型:

    public class MyGenericFactory<T>
    {
        public T create(String version) throws VersionNotSupportedException {...}
    }
    
    公共类MyGenericFactory
    {
    public T create(字符串版本)抛出VersionNotSupportedException{…}
    }
    
    搜索接口和工厂。(有趣的是,你应该提到
    设计模式
    )我认为接口和工厂只是抽象了回购的外部行为,但我正在考虑回购内部机制的最佳实践。e、 g.如何将不同版本的算法打包到jar中。如何存储它们,如何处理特定的版本,等等。对于一个给定的算法,每个版本是在一个单独的类中实现的(不同的完全限定名)?我不喜欢这样做,因为我不想将版本与类名耦合。版本只能在发布时确定。根据算法的抽象级别,您可以查看API提供的版本。