这个问题有点受到 previous question 的启发。我问过了
我编写的大部分代码都与 API 相关,API 本质上必须易于扩展。我和我的团队的其他成员正在努力解决他如何处理插件的一个常见问题,即可以扩展我们自己的接口(interface)的类,并且在最终实现中应该感觉像是解决方案的原子部分。我特别考虑以下类型的用例(使用汽车类比)
接口(interface):
Car
提供的实现:
Ford
Audi
第 3 方实现:
Toyota
我们通常需要的是 CarDealer
类了解 Car
的所有现有实现,而无需强制第 3 方显式声明 Car
在配置文件中。我一直在考虑的一个想法是让 Car
的实现在 CarDealer
中注册自己,但这打开了一个新的蠕虫 jar 头,因为 Toyota
(或任何其他实现)在被显式引用之前不会被初始化,这是一个 catch22。注释 Car
的实现,然后遍历代码并使用相关注释初始化任何类也是一种方法,但我担心这可能会占用大量资源。
我想我们不可能是第一个解决这个问题的人,那么有没有已知的设计模式可以解决这个问题?
最佳答案
看看 java.util.ServiceLoader。本质上,您创建了一个接口(interface),然后该服务的所有实现者都可以包含一个文件/META-INF/services/
然后可以使用 ServiceLoader 加载在类路径中发现的所有实现(例如 JDBC 4.0 要求驱动程序也使用它来摆脱使用 Class.forName(...) 来加载驱动程序)。
关于java - 在 Java 中处理插件有什么好的模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7929281/