Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的抽象工厂模式——数组填充问题_Java - Fatal编程技术网

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()
。实际上,您不需要在接口中显式声明它。