Фабрики C ++ -> Фабрики Java? - PullRequest
0 голосов
/ 12 апреля 2011

Когда я впервые изучал C ++, я наткнулся на эту статью о фабриках, Pluggable C ++ Factory , и с тех пор, как я использовал этот шаблон для своих фабрик в C ++.Так вот, я недавно занимался Java, и не раз мне хотелось использовать фабрику, но я не могу найти способ расширить фабрику во время компиляции.

Любая реализация фабрики, о которой я могу думать в Java, включает в себя рассказ фактического класса фабрики обо всех базовых классах, что является довольно неоптимальным.

Итак, как я могу заставить все подклассы класса регистрироваться в статическом словаре во время компиляции / создания программы?

EDIT Похоже, мой вопрос былслишком расплывчатоПозвольте мне уточнить,

В 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.

Ответы [ 3 ]

0 голосов
/ 12 апреля 2011

Подумайте о реализации фабричного метода с использованием Reflection.

0 голосов
/ 12 апреля 2011

Может оказаться полезной библиотека Reflections .

Используя 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 

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

0 голосов
/ 12 апреля 2011

Я думаю, класс ServiceLoader может вам помочь.

...