2

我正在编写一个应用程序,它将以几个不同的版本发布(最初将存在大约 10 种代码库变体,并且需要维护)。当然,98% 左右的代码在不同的系统中是相同的,保持代码库完整是有意义的。

我的问题是 - 这样做的首选方法是什么?例如,如果我有一个在某些版本(MyClassDifferent)中不同的类(MyClass),并且该类在几个地方被引用。我希望根据我正在编译的应用程序的版本来更改该引用,而不必拆分所有引用 MyClassDifferent 的类。预处理器宏会很好,但是它们会使代码膨胀,而且 afaik 只有概念验证实现可用吗?

我正在考虑类似工厂模式的东西,以及每个应用程序的配置文件。有没有人有任何提示或指示?

4

4 回答 4

4

您走在正确的轨道上:工厂模式、配置等。

您还可以将系统特定功能放在单独的 jar 文件中,然后只需在核心 jar 文件旁边包含适当的 jar。

于 2009-05-20T08:08:01.050 回答
2

我会支持你的工厂方法,你应该仔细看看 maven 或 ant(取决于你使用的是什么)。您可以部署不同的配置文件,这些文件根据参数/配置文件确定使用哪些类。

像 C/C++ 这样的预处理器宏不能直接用于 java。尽管也许可以通过构建脚本来模拟这一点。但我不会走那条路。我的建议是坚持工厂方法。

于 2009-05-20T08:09:11.923 回答
2

幸运的是你有几个选择

1)ServiceLoader(内置于java6)将你的API类像MyClass放在一个jar中,针对这个API编译你的应用程序。然后用 /META-INF/services/com.foo.MyClass 将 MyClass 的单独实现放在单独的 jar 中。. 然后,您可以维护应用程序的多个版本,只需保持 jar 的“分发”即可。您的“主”类只是一堆 ServiceLoader 调用

2) 与 1) 相同的架构,但用 Spring 或 Guice 配置替换 META-INF 服务

3)OSGI

4)你的解决方案

于 2009-05-20T08:21:03.410 回答
1

查找 AbstractFactory 设计模式、“依赖注入”和“控制反转”。Martin Fowler在这里写了这些。

简而言之,您将 JAR 文件与所有需要的组件一起发布。对于每个可以自定义的服务点,您都可以为服务定义一个接口。然后您编写该接口的一个或多个实现。要创建服务对象,您需要向 AbstractFactory 请求它,例如:

AbstractFactory factory = new AbstractFactory();
...
ServiceXYZ s = factory.newServiceXYZ();
s.doThis();
s.doThat();

在 AbstractFactory 中,您使用 Java 反射方法 Class.classForName() 和 SomeClassObject.newInstance() 构造适当的 ServiceXYZ 对象。(这样做意味着您不必在 jar 文件中包含 ServiceXYZ 类,除非它有意义。您也可以正常构建对象。)

实际的类名是从每个站点唯一的属性文件中读入的。

您可以轻松推出自己的解决方案,或者使用SpringGuicePico等框架。

于 2009-05-22T03:48:38.943 回答