Дизайн парковки [closed]

Я пытался спроектировать проблему с парковкой. Вот постановка проблемы.

Создайте многоэтажную автостоянку, на которой клиенты смогут парковать свои машины. На каждом этаже парковки будет много парковочных мест. Система должна поддерживать несколько типов парковочных мест, таких как компактные, большие, для инвалидов, мотоциклов и т. Д. Система должна поддерживать парковку для различных типов транспортных средств, таких как легковые автомобили, грузовики, фургоны, мотоциклы и т. Д. — мотоциклы можно припарковать только на мотоцикле. споты — автомобили можно припарковать на компактных или больших местах — электромобили можно припарковать на компактных, больших или электрических местах — грузовики и фургоны можно припарковать только на больших местах.

Ниже приведены некоторые из созданных мною классов.

public abstract class ParkingSpot {

    private ParkingSpotType type;

    private boolean isFree;

    private Vehicle vehicle;

    public ParkingSpot (ParkingSpotType type) {
        this.type = type;
    }
    
    public boolean isFree() {
        return this.isFree;
    }

    public void assignVehicle(Vehicle vehicle) {
        this.vehicle = vehicle;
        this.isFree = false;
    }

    public void removeVehicle() {
        this.vehicle = null;
        isFree = true;
    }

    public ParkingSpotType getType() {
        return this.type;
    }

    public Vehicle getVehicle() {
        return this.vehicle;
    }
}

public class CompactParkingSpot extends ParkingSpot {

    public CompactParkingSpot(ParkingSpotType type) {
        super(ParkingSpotType.COMPACT);
    }

}

public class ElectricParkingSpot extends ParkingSpot {

    public ElectricParkingSpot(ParkingSpotType type) {
        super(ParkingSpotType.ELECTRIC);
    }

}

public class HandicappedParkingSpot extends ParkingSpot {

    public HandicappedParkingSpot(ParkingSpotType type) {
        super(ParkingSpotType.HANDICAPPED);
    }

}

public class LargeParkingSpot extends ParkingSpot {

    public LargeParkingSpot(ParkingSpotType type) {
        super(ParkingSpotType.LARGE);
    }
}

public class MotorBikeParkingSpot extends ParkingSpot {

    public MotorBikeParkingSpot(ParkingSpotType type) {
        super(ParkingSpotType.MOTORBIKE);
    }

}

public enum ParkingSpotType {
    HANDICAPPED, MOTORBIKE, COMPACT, LARGE, ELECTRIC
}

Точно так же я создал модели для разных транспортных средств и Enum для VehicleTypes.

Ниже представлена ​​частичная реализация классов ParkingLot и PrkingFloor.

public class ParkingLot {

    private List<ParkingFloor> prkingFloor;

    // This count values would be incremented every time a vehicle is parked
    private int compactParkingSpotCount;
    private int electricParkingSpotCount;
    // private int handicappedParkingSpotCount;
    private int largeParkingSpotCount;
    private int motorBikeParkingSpotCount;

    private int maxAvailableCompactParkingSpots;
    private int maxAvailableElectricParkingSpots;
    // private int maxAvailableHandicappedParkingSpots;
    private int maxAvailableLargeParkingSpots;
    private int maxAvailableMotorBikeParkingSpots;

    public boolean isFull(VehicleType type) {
        // trucks and vans can only be parked in LargeSpot
        if (type == VehicleType.TRUCK || type == VehicleType.VAN) {
            return largeParkingSpotCount >= maxAvailableLargeParkingSpots;
        }

        // motorbikes can only be parked at motorbike spots
        if (type == VehicleType.MOTORBIKE) {
            return motorBikeParkingSpotCount >= maxAvailableMotorBikeParkingSpots;
        }

        // cars can be parked at compact or large spots
        if (type == VehicleType.CAR) {
            return (compactParkingSpotCount + largeParkingSpotCount) >= (maxAvailableCompactParkingSpots
                    + maxAvailableLargeParkingSpots);
        }

        // electric car can be parked at compact, large or electric spots
        return (compactParkingSpotCount + largeParkingSpotCount
                + electricParkingSpotCount) >= (maxAvailableCompactParkingSpots + maxAvailableLargeParkingSpots
                        + maxAvailableElectricParkingSpots);
    }

    // increment the parking spot count based on the vehicle type
    private void incrementSpotCount(VehicleType type) {
        if (type == VehicleType.TRUCK || type == VehicleType.VAN) {
            largeParkingSpotCount++;
        } else if (type == VehicleType.MOTORBIKE) {
            motorBikeParkingSpotCount++;
        } else if (type == VehicleType.CAR) {
            if (compactParkingSpotCount < maxAvailableCompactParkingSpots) {
                compactParkingSpotCount++;
            } else {
                largeParkingSpotCount++;
            }
        } else { // electric car
            if (electricParkingSpotCount < maxAvailableElectricParkingSpots) {
                electricParkingSpotCount++;
            } else if (compactParkingSpotCount < maxAvailableCompactParkingSpots) {
                compactParkingSpotCount++;
            } else {
                largeParkingSpotCount++;
            }
        }
    }

}


public class ParkingFloor {

    private String name;

    private Map<String, HandicappedParkingSpot> handicappedParkingSpots;
    private Map<String, CompactParkingSpot> compactparkingSpots;
    private Map<String, LargeParkingSpot> largeparkingSpots;
    private Map<String, MotorBikeParkingSpot> motorbikeParkingSpots;
    private Map<String, ElectricParkingSpot> electricParkingSpots;

    public void addParkingSpot(ParkingSpot spot) {
        switch (spot.getType()) {
        case HANDICAPPED:
            handicappedParkingSpots.put(spot.getNumber(), (HandicappedParkingSpot) spot);
            break;
        case COMPACT:
            compactparkingSpots.put(spot.getNumber(), (CompactParkingSpot) spot);
            break;
        case LARGE:
            largeparkingSpots.put(spot.getNumber(), (LargeParkingSpot) spot);
            break;
        case MOTORBIKE:
            motorbikeParkingSpots.put(spot.getNumber(), (MotorBikeParkingSpot) spot);
            break;
        case ELECTRIC:
            electricParkingSpots.put(spot.getNumber(), (ElectricParkingSpot) spot);
            break;
        default:
            System.out.println("Wrong parking spot type!");
        }
    }

    public void assignVehicleToSpot(Vehicle vehicle, ParkingSpot spot) {
        spot.assignVehicle(vehicle);
        switch (spot.getType()) {
        case HANDICAPPED:
            // updateDisplayBoardForHandicapped(spot);
            break;
        case COMPACT:
            // updateDisplayBoardForCompact(spot);
            break;
        case LARGE:
            // updateDisplayBoardForLarge(spot);
            break;
        case MOTORBIKE:
            // updateDisplayBoardForMotorbike(spot);
            break;
        case ELECTRIC:
            // updateDisplayBoardForCompact(spot);
            break;
        default:
            System.out.println("Wrong parking spot type!");
        }
    }

}

Я не могу придумать стратегию назначения парковочного места автомобилю. Я могу предложить два разных подхода:

  1. При инициализации парковочного этажа добавьте все парковочные места с флагом isFree как true. Когда мне нужно назначить место для парковки транспортному средству, мне нужно выполнить поиск по всем парам ключ / значение в hashMap (compactparkingSpots / largeparkingSpots и т. Д., Присутствующие в объекте ParkingFloor) и проверить наличие свободного места. Я считаю это неэффективным, и каждое транспортное средство будет ждать, пока наша программа не найдет подходящую бесплатную парковку.
  2. При добавлении ParkingSpots на ParkingFloor увеличивайте id для каждого места. Итак, если на этаже 1 5 компактных парковочных мест с идентификаторами от 1 до 5, на втором этаже будут еще 5 компактных парковочных мест с идентификаторами от 5 до 10. Точно так же на всех этажах будут парковочные места с инкрементными идентификаторами. Мы можем узнать идентификатор следующей бесплатной парковки. Итак, если 5 компактных парковочных мест заполнены, следующим доступным идентификатором будет 6. В этом случае нам также придется перебирать каждый этаж, чтобы проверить, на каком этаже есть компактная парковка с идентификатором 6. Это тоже я считаю неэффективным.

Я не могу придумать эффективную стратегию для быстрого и эффективного назначения подходящего места для парковки автомобилю.

Пожалуйста, помогите мне с правильной стратегией.

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *