Java中的抽象工厂模式 - 问题填充数组

时间:2016-02-24 08:33:45

标签: 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");
    }

}

当我测试我的代码时,我意识到我的数组从未填充过并且为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");
    }

}

1 个答案:

答案 0 :(得分:0)

你总是返回空数组

更改

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

到这个

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