Java 如何实现算法库?
我有一套用Java实现的算法,并打包成jar文件。这些算法旨在供第三方访问。这些算法有几个变体。超时,新版本和新类型的算法将被添加到。同时,我不会强迫所有第三方使用新算法 我正在考虑为此实现一个简单的存储库系统。要求如下:Java 如何实现算法库?,java,design-patterns,repository,repository-design,Java,Design Patterns,Repository,Repository Design,我有一套用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提供的版本。