Скажем, у меня есть Java-интерфейс Blender.java
с различными реализациями Cuisinart.java
, Oster.java
, Blendtec.java
и т.д. Теперь я хочу написать такую программу:
public class Blendifier {
// ...
public static void main(String... args) {
Blender blender = new Cuisinart();
blender.blend();
}
}
Но теперь, если я хочу использовать Blendtec
вместо Cuisinart
, я должен открыть источник, изменить код и перекомпилировать.
Вместо этого я хотел бы указать, какой Blender
использовать "на лету", когда я запускаю программу, написав имя класса, которое я хочу в качестве аргумента командной строки.
Но как я могу перейти от String, содержащего имя класса, к созданию фактического экземпляра этого класса?
Если вы не хотите преодолевать проблемы, которые являются отражением Java, вы можете написать простой статический заводский метод, который принимает строку и возвращает соответствующий объект.
public static Blender createBlender(String type){
switch(type){
case "Cuisinart": return new Cuisinart();
case "Oster": return new Oster();
//etc
}
}
Затем вы просто передаете аргумент командной строки, и у вас будет все, что вам нужно.
Единственная возможная проблема с дизайном заключается в том, что вам придется вводить строку для каждого класса, который реализует Blender, поэтому вам придется обновить этот метод, если позже вы добавите больше типов.
У вас есть несколько способов сделать это:
например, конструкция if-else
Blender blender = null;
if (args[0].equals("Cuisinart")) {
blender = new Cuisinart();
} else if (...)
где args [0] - ваш первый аргумент командной строки.