在我的应用程序中,我定义了四个接口,例如A
,B
,C
和D
。根据编译时的设置,我想使用这些接口的不同实现。我这样定义了一个抽象工厂Factory
:
package app.core;
abstract class Factory {
public abstract A getA();
public abstract B getB();
public abstract C getC();
public abstract D getD();
}
和两个实现,它们返回接口A
,B
,C
和D
的不同实现;每个设置在不同的程序包中:
package app.core.monolithic;
class MonoA implements A { ... } // and so on for B, C and D
class MonolithicFactory extends Factory {
/* implementations of getters */
}
package app.core.modular;
class ModularA implements A { ... } // and so on for B, C and D
class ModularFactory extends Factory {
/* implementations of getters */
}
如何防止访问工厂实施?我可以将接口的实现保留为包私有,但是如果对工厂实现进行相同操作,则确定要使用的实现的代码将无法实例化任何具体的工厂,因为它位于app.core
中。>
我已经将头撞在桌子上了几个小时,所以我可能缺少明显的东西。在我看来,这只有通过反射才能实现,除非我将所有内容都放在一个包中。
答案 0 :(得分:0)
将工厂实现定义为返回这些工厂实例的公共类的private static
类。
客户将从这个公共类中检索工厂实例。
这样,工厂的客户只能引用工厂接口。
请注意,您应该为Factory
引入一个接口,因为客户端不需要知道抽象类的存在。
另一种替代方法是提供两种包装:API和实现JAR。
客户端应在编译时依赖于API jar,并在运行时依赖于API和实现JAR。
许多库都以这种方式工作,以实现内部API之间的分离。