Фабрики C -> фабрики Java?

#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 
  

Используя эту библиотеку, вы можете определить интерфейс и фабрику, которые могут создавать любую реализацию этого интерфейса (путем поиска этих реализаций)