#java #c #factory-pattern
#java #c #фабричный шаблон
Вопрос:
Когда я впервые изучал C , я наткнулся на эту статью о фабриках, подключаемой фабрике C , и с тех пор я использую этот шаблон для своих фабрик на C . Недавно я занимался Java, и не раз мне хотелось использовать фабрику, но, похоже, я не могу придумать способ расширить фабрику во время компиляции.
Любая реализация фабрики, о которой я могу подумать на Java, включает в себя сообщение фактическому классу factory обо всех базовых классах, что довольно неоптимально.
Итак, как я могу заставить все подклассы класса регистрировать себя в статическом словаре во время компиляции / создания экземпляра программы?
РЕДАКТИРОВАТЬ Похоже, что мой вопрос был слишком расплывчатым. Позвольте мне уточнить,
В Java, если бы я попытался воспроизвести этот шаблон следующим образом: Factory.java
abstract class Factory {
private static Dictionary<int, Factory> dict;
public Factory(int index) {
dict[int] = self;
}
public Foo getFoo(int index) {return dict[index].createFoo();}
protected abstract Foo makeFoo();
}
Derived.java
class Derived extends Factory {
public Derived() {super(DERIVED_INDEX);}
private static Derived tmp = new Derived();
public Foo makeFoo() {return new FooImplementation();}
}
Фабрика не будет обновляться ссылкой на Derived (и, следовательно, не будет создавать производные экземпляры), если я сам не зарегистрирую ее вручную, что противоречит цели наличия статического элемента tmp.
Комментарии:
1. Не думаю, что это требует
c
тега2. Учитывая, что все в упомянутой статье тривиально переведено на Java, в чем именно заключается вопрос?
Ответ №1:
Я думаю, что класс ServiceLoader может вам здесь помочь.
Ответ №2:
Подумайте о реализации фабричного метода с использованием отражения.
Ответ №3:
Возможно, вам пригодится библиотека Reflections.
Используя отражения, вы можете запрашивать свои метаданные, такие как:
* get all subtypes of some type
* get all types/methods/fields annotated with some annotation, w/o annotation parameters matching
* get all resources matching matching a regular expression
Используя эту библиотеку, вы можете определить интерфейс и фабрику, которые могут создавать любую реализацию этого интерфейса (путем поиска этих реализаций)