Java中的抽象工厂模式——数组填充问题
我试图学习如何使用抽象工厂模式。情况如下: 我有几个类实现了如下接口:Java中的抽象工厂模式——数组填充问题,java,Java,我试图学习如何使用抽象工厂模式。情况如下: 我有几个类实现了如下接口: public abstract class BattFactory { public BatteryComponents[] parts; public BattFactory() { } public static CarBattery buildBattery(CarType type) { CarBattery battery = null; Loc
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;
}
}
班级(有几个不同的班级):
界面:
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();
}
}
这是我们的工厂:
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 --
更新:
我尝试集成collectParts()包括对Carbatery和从中继承的类的一些重构。它现在正在工作
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");
}
}
公共类SoulevCarBattery扩展了CarBattery{
公共电池组件[]部件;
公共厕所(位置){
super(CarType.SOULEV,位置);
构造();
收集零件(位置);
}
公共电池部件[]收集部件(位置){
开关(位置){
案例美国:
零件=新电池组件[]{新锂电池(),新铝合金(),新ArduinoController(),新OneEnvCharger()};
//电池组件零件[]={新锂电池(),新铝合金(),新ArduinoController(),新OneEnvCharger()};
打破
}
返回部件;
}
@凌驾
公共字符串toString(){
StringBuffer结果=新的StringBuffer();
如果(部件!=null){
对于(int i=0;i
您总是返回空数组
改变
BatteryComponents parts[] = {new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
对此
parts = new BatteryComponents []{new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
您总是返回空数组 改变
BatteryComponents parts[] = {new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
对此
parts = new BatteryComponents []{new LithiumCells(), new AluminiumCasing(), new ArduinoController(), new OneTenVCharger()};
我只是尝试了你的建议,不幸的是我仍然得到--“不起作用--”你的CarBattery.buildBattery()代码在哪里?,您似乎没有在任何地方调用collectParts…我在BattFactory中有它。您可以在此处发布类UsabttFactory吗?您没有在代码中的任何地方调用collectParts方法,因此您的parts数组尚未初始化,导致此错误。此外,您无需申报公共电池组件[]部件;在child Classis中,我刚刚尝试了您的建议,但不幸的是,我仍然得到--“无法工作--”您的CarBattery.buildBattery()代码在哪里?,您似乎没有在任何地方调用collectParts…我在BattFactory中有它。您可以在此处发布类UsabttFactory吗?您没有在代码中的任何地方调用collectParts方法,因此您的parts数组尚未初始化,导致此错误。此外,您无需申报公共电池组件[]部件;在子类中注意:您的
电池组件.toString()
方法重写对象.toString()
。实际上,您不需要在接口中显式声明它。注意:您的battycomponents.toString()
方法重写Object.toString()
。实际上,您不需要在接口中显式声明它。