我有一个工厂类,可以创建某种类型的对象(比如MyClass
)。
工厂类属于特定的包,我想在该包中的实现和较新的版本之间动态切换,以进行测试。
例如,假设原始软件包为pack1
,较新版本为pack2
,类名为pack1.Factory
和pack2.Factory
。 pack1
或pack2
的选择将通过属性文件中的简单参数指定。此外,MyClass
类型对于两个包都是通用的,并且只应使用普通的Java(即,没有第三方库)。
我正在考虑使用Class.forName()
加载pack1.Factory
或pack2.Factory
(取决于指定的属性),然后通过反射调用所有工厂方法。
这是最好的方法吗?
答案 0 :(得分:3)
这几乎是注射控制的经典用例。 Guice应该让你立刻开始。
需要使用IFactory
等接口,并使用一些工厂方法create
。创建两个Guice模块 - 一个绑定IFactory
到pack1.Factory
,另一个绑定到pack2.Factory
。当然,这两家工厂都应该实施IFactory
。
然后在main方法处理中确定应该使用哪个工厂的参数,并分别根据其中一个模块创建一个注入器。
答案 1 :(得分:-1)
你应尽可能避免反思。它使您的代码更难理解,更难以重构和更难维护。
相反,您可以让工厂类实现一个接口,创建一个您要测试的工厂实例,并使用此实例调用您的测试。