Я пытаюсь научиться использовать абстрактный шаблон фабрики. Вот ситуация:Абстрактный шаблон фабрики в Java - проблемы с заполняющим массивом
У меня есть несколько классов, которые реализуют интерфейс вроде этого:
Класс (есть несколько различных них):
public class AluminiumCasing implements BatteryComponents {
public String toString() {
return "Aluminum Casing";
}
}
Интерфейс:
public interface BatteryComponents {
public String toString();
}
у меня есть перечисление:
public enum CarType {
SOULEV, OPTIMAHYBRID, RIO
}
Я пытаюсь заполнить массив с различными компонентами батареи следующим образом:
public abstract class CarBattery {
public BatteryComponents[] parts;
private CarType model = null;
private Location location = null;
public CarBattery(CarType model, Location location) {
this.model = model;
this.location = location;
}
protected abstract void construct();
//this is the array i am unable to populate. Once it works, the idea is to fill it with different parts according the model
public BatteryComponents[] collectParts(CarType model) {
this.model = model;
switch (model) {
case SOULEV :
// Change made with SO user suggestion. This has not fixed it.
parts = new BatteryComponents []{ new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
//BatteryComponents parts[] = { new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
break;
}
return parts;
}
@Override
public String toString() {
StringBuffer result = new StringBuffer();
if (parts != null) {
for (int i = 0; i < parts.length; i++) {
result.append(parts[i]);
if (i < parts.length-1) {
result.append(", ");
}
}
}
else {
result.append("-- not working --");
}
return result.toString();
}
}
Я создал аккумуляторный завод (BattFactory), как это:
public abstract class BattFactory {
public BatteryComponents[] parts;
public BattFactory() {
}
public static CarBattery buildBattery(CarType type) {
CarBattery battery = null;
Location location = null;
Scanner in = new Scanner(System.in);
boolean validInput;
do {
System.out.print("Choose region : 'u' for USA, 'a' for Asia, or 'e' for EU: ");
char inChar = in.next().toLowerCase().charAt(0); // Convert to lowercase and extract first char
validInput = true;
if (inChar == 'u') {
location = Location.USA;
} else if (inChar == 'a') {
location = Location.ASIA;
} else if (inChar == 'e') {
location = Location.EU;
} else {
System.out.println(" Invalid input, try again...");
validInput = false;
}
} while (!validInput);
switch(location) {
case USA :
battery = USABattFactory.buildBattery(type);
break;
case ASIA :
battery = AsiaBattFactory.buildBattery(type);
break;
case EU :
battery = EUBattFactory.buildBattery(type);
}
return battery;
}
}
Вот USABattFactory:
public class USABattFactory extends BattFactory {
//public String carModel;
public BatteryComponents[] parts;
public static CarBattery buildBattery(CarType model) {
CarBattery car = null;
switch (model) {
case SOULEV :
car = new SoulevCarBattery(Location.USA);
break;
case OPTIMAHYBRID :
car = new OptimaHybridCarBattery(Location.USA);
break;
case RIO :
car = new RioCarBattery(Location.USA);
default:
break;
}
return car;
}
}
Я продлил аккумуляторную батарею, чтобы создать конкретный тип батареи:
public class SoulevCarBattery extends CarBattery {
public BatteryComponents[] parts;
public SoulevCarBattery(Location location){
super(CarType.SOULEV, location);
construct();
}
@Override
protected void construct() {
System.out.println("Building Soulev car battery");
}
}
Когда я проверить мой код, я понимаю, что мой массив никогда не был заселен и равна нулю:
public class TestBattery {
public static void main(String[] args) {
System.out.println(BattFactory.buildBattery(CarType.SOULEV));
}
}
Результат:
Choose region : 'u' for USA, 'a' for Asia, or 'e' for EU: u
Building Soulev car battery
-- not working --
UPDATE:
Моя попытка для интеграции collectParts() включает в себя некоторую реструктуризацию CarBattery и классы, которые наследуют ее. Сейчас он работает.
public class SoulevCarBattery extends CarBattery {
public BatteryComponents[] parts;
public SoulevCarBattery(Location location){
super(CarType.SOULEV, location);
construct();
collectParts(location);
}
public BatteryComponents[] collectParts(Location location) {
switch (location) {
case USA :
parts = new BatteryComponents []{ new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
//BatteryComponents parts[] = { new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
break;
}
return parts;
}
@Override
public String toString() {
StringBuffer result = new StringBuffer();
if (parts != null) {
for (int i = 0; i < parts.length; i++) {
result.append(parts[i]);
if (i < parts.length-1) {
result.append(", ");
}
}
}
else {
result.append("-- not working --");
}
return result.toString();
//return model + " car battery built in " + location + result.toString();
}
@Override
protected void construct() {
System.out.println("Building Soulev car battery");
}
}
Примечание: ваш 'BatteryComponents.toString()' 'метод переопределяет Object.toString () '. Вам не нужно явно объявлять его в интерфейсе. –