Мне кажется, я понимаю, что вы пытаетесь сделать, но вы путаете терминологию.Если ваша цель состоит в том, чтобы создать единственное приложение, которое поддерживает один тип автомобиля, то ответ Марка - то, что вы собираетесь.Если, однако, вам нужна фабрика, которая создает несколько типов автомобилей с разными конфигурациями, для которых вы не знаете, какие они есть во время компиляции / запуска, вам нужно подойти к этой идее по-другому.
В этой версии у нас будет несколько «типов» автомобилей, определенных в профиле, поэтому у нас будет класс автомобиля POJO.
public class Car {
private String model;
private String type;
public Car() {
}
public Car(String model, String type) {
this.model = model;
this.type = type;
}
}
Тогда у нас будет ваш CarFactory только потому, чтоу нас есть несколько конфигураций для фабрики, мы будем обрабатывать их на карте.
public class CarFactory {
Map<String, ConfiguredCarFactory> factories = new HashMap<>();
public Car makeCar(String profile) {
return getFactory(profile).makeCar();
}
private ConfiguredCarFactory getFactory(String profile) {
ConfiguredCarFactory carFactory = factories.get(profile);
if(carFactory == null) {
carFactory = new ConfiguredCarFactory(profile);
factories.put(profile, carFactory);
}
return carFactory;
}
}
В этом случае профиль, который я использую для простоты, был фактическим местоположением файла свойств.Это не настроено как Бин, но это может быть очень быстро, если вы хотите создать Бин для обработки функций карты под прикрытием.
Тогда, наконец, у нас будет настроенная CarFactory, выполняющаяфактическое создание автомобиля, по профилю.
public class ConfiguredCarFactory {
private final String profile;
private String model;
private String type;
public ConfiguredCarFactory(String profile) {
this.profile = profile;
Properties prop = new Properties();
File file = new File(profile);
try(FileInputStream input = new FileInputStream(profile)) {
prop.load(input);
model = (String) prop.get("model");
type = (String) prop.get("type");
} catch (Exception e) {
e.printStackTrace();
model = "Generic";
type = "Generic";
}
}
public Car makeCar() {
return new Car(model, type);
}
}
Хотя это, безусловно, отвечает вашим требованиям, я не решаюсь сказать, что это то, что вы ищете.Предоставление неизвестного количества конфигураций автомобилей в качестве свойств менее идеально, чем, скажем, сохранение всех конфигураций автомобилей в базе данных и создание экземпляров в виде сущностей через JPA.Это гораздо более «динамично» и будет более точно следовать философии проектирования Spring, чем что-то относительно жесткое и требующее наличия файлов конфигурации на машине в дополнение к некоторому неизвестному вводу из источника файла.