2016-02-24 2 views
1

Я пытаюсь научиться использовать абстрактный шаблон фабрики. Вот ситуация:Абстрактный шаблон фабрики в 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"); 
    } 

} 
+1

Примечание: ваш 'BatteryComponents.toString()' 'метод переопределяет Object.toString () '. Вам не нужно явно объявлять его в интерфейсе. –

ответ

0

Вы всегда возвращаются пустой массив

Изменить

BatteryComponents parts[] = {new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()}; 

к этому

parts = new BatteryComponents []{new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()}; 
+0

Я просто попробовал то, что вы предложили, и, к сожалению, я все еще получаю «- не работает». – user25976

+0

Где ваш код CarBattery.buildBattery() ?, Вы, кажется, не набираете collectParts в любом месте ... – Ashish

+0

I имейте это в BattFactory – user25976

Смежные вопросы