我正在尝试学习如何使用抽象工厂模式。情况如下:
我有几个类实现了这样的接口:
班级(有几个不同的班级):
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");
}
}
当我测试我的代码时,我意识到我的数组从未填充过并且为null:
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 --
更新:
我尝试整合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");
}
}
答案 0 :(得分:0)
你总是返回空数组
更改
BatteryComponents parts[] = {new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
到这个
parts = new BatteryComponents []{new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};