隐藏工厂实现

时间:2018-08-30 20:02:52

标签: java abstract-factory

在我的应用程序中,我定义了四个接口,例如ABCD。根据编译时的设置,我想使用这些接口的不同实现。我这样定义了一个抽象工厂Factory

package app.core;

abstract class Factory {
    public abstract A getA();
    public abstract B getB();
    public abstract C getC();
    public abstract D getD();
}

和两个实现,它们返回接口ABCD的不同实现;每个设置在不同的程序包中:

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中。

我已经将头撞在桌子上了几个小时,所以我可能缺少明显的东西。在我看来,这只有通过反射才能实现,除非我将所有内容都放在一个包中。

1 个答案:

答案 0 :(得分:0)

将工厂实现定义为返回这些工厂实例的公共类的private static类。
客户将从这个公共类中检索工厂实例。
这样,工厂的客户只能引用工厂接口。
请注意,您应该为Factory引入一个接口,因为客户端不需要知道抽象类的存在。

另一种替代方法是提供两种包装:API和实现JAR。
客户端应在编译时依赖于API jar,并在运行时依赖于API和实现JAR。
许多库都以这种方式工作,以实现内部API之间的分离。