В моем приложении я определил четыре интерфейса, скажем 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
.
Я уже несколько часов бьюсь головой о свой стол, так что я могу упустить что-то очевидное. Мне кажется, что это возможно только с помощью рефлексии, если я не храню все в одной упаковке.