I need to design a simple single floor parking design system which have three different types of parking slot available for two wheeler , four wheeler and Eight Wheeler Vehicle. Is Oops concepts are taken care in my code , I believe I am doing lot of repetitive codes.
public interface Slot {
String getSlotType();
int getSlotNUmber();
boolean isEmpty();
Vehicle getCurrentVechicle();
void parkVehicle(Vehicle vehicle);
void removeVehicle();
}
public class TwoWheelerSlot implements Slot {
private String slotType;
private int slotNumber;
private boolean isEmpty;
private Vehicle vehicle;
public TwoWheelerSlot(int slotNumber){
this.slotType = String.valueOf(SlotType.TWO_WHEELER);
this.isEmpty = true;
this.slotNumber = slotNumber;
}
@Override
public String getSlotType() {
return slotType;
}
@Override
public int getSlotNUmber() {
return slotNumber;
}
@Override
public boolean isEmpty() {
return isEmpty;
}
@Override
public Vehicle getCurrentVechicle() {
return vehicle;
}
@Override
public void parkVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
isEmpty = false;
}
@Override
public void removeVehicle() {
isEmpty = true;
}
}
public class FourWheelerSlot implements Slot {
private String slotType;
private int slotNumber;
private boolean isEmpty;
private Vehicle vehicle;
public FourWheelerSlot(int slotNumber){
this.slotType = String.valueOf(SlotType.FOUR_WHEELER);;
this.isEmpty = true;
this.slotNumber = slotNumber;
}
@Override
public String getSlotType() {
return slotType;
}
@Override
public int getSlotNUmber() {
return slotNumber;
}
@Override
public boolean isEmpty() {
return isEmpty;
}
@Override
public Vehicle getCurrentVechicle() {
return vehicle;
}
@Override
public void parkVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
isEmpty = false;
}
@Override
public void removeVehicle() {
isEmpty = true;
}
}
public class EightWheelerSlot implements Slot {
private String slotType;
private int slotNumber;
private boolean isEmpty;
private Vehicle vehicle;
public EightWheelerSlot(int slotNumber){
this.slotType = String.valueOf(SlotType.EIGHT_WHEELER);;
this.isEmpty = true;
this.slotNumber = slotNumber;
}
@Override
public String getSlotType() {
return slotType;
}
@Override
public int getSlotNUmber() {
return slotNumber;
}
@Override
public boolean isEmpty() {
return isEmpty;
}
@Override
public Vehicle getCurrentVechicle() {
return vehicle;
}
@Override
public void parkVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
isEmpty = false;
}
@Override
public void removeVehicle() {
isEmpty = true;
}
}
public enum SlotType {
TWO_WHEELER,
FOUR_WHEELER,
EIGHT_WHEELER
}
public class SlotFactory {
public Slot createSlot(SlotType slotType, int slotNumber) {
switch (slotType) {
case TWO_WHEELER:
return new TwoWheelerSlot(slotNumber);
case FOUR_WHEELER:
return new FourWheelerSlot(slotNumber);
case EIGHT_WHEELER:
return new EightWheelerSlot(slotNumber);
default:
throw new IllegalArgumentException("Invalid slot type: " + slotType);
}
}
}
public interface Vehicle {
VehicleType getVehicleType();
String getVehicleNumber();
}
public class TwoWheelerVehicle implements Vehicle {
private VehicleType vehicleType;
private String vehicleNUmber;
public TwoWheelerVehicle(String vehicleNUmber){
this.vehicleNUmber = vehicleNUmber;
this.vehicleType = VehicleType.TWO_WHEELER;
}
@Override
public VehicleType getVehicleType() {
return vehicleType;
}
@Override
public String getVehicleNumber() {
return vehicleNUmber;
}
}
public class FourWheelerVehicle implements Vehicle {
private VehicleType vehicleType;
private String vehicleNUmber;
public FourWheelerVehicle(String vehicleNUmber){
this.vehicleNUmber = vehicleNUmber;
this.vehicleType = VehicleType.FOUR_WHEELER;
}
@Override
public VehicleType getVehicleType() {
return vehicleType;
}
@Override
public String getVehicleNumber() {
return vehicleNUmber;
}
}
public class EightWheelerVehicle implements Vehicle {
private VehicleType vehicleType;
private String vehicleNUmber;
public EightWheelerVehicle(String vehicleNUmber){
this.vehicleNUmber = vehicleNUmber;
this.vehicleType = VehicleType.EIGHT_WHEELER;
}
@Override
public VehicleType getVehicleType() {
return vehicleType;
}
@Override
public String getVehicleNumber() {
return vehicleNUmber;
}
}
public enum VehicleType {
TWO_WHEELER,
FOUR_WHEELER,
EIGHT_WHEELER
}
import java.util.List;
public class ParkingSpotManager {
List<Slot> parkingSlots;
public ParkingSpotManager(List<Slot> slots){ // Dependency INjection
this.parkingSlots = slots;
}
public Slot parkVehicle(Vehicle vehicle) {
System.out.println("Looking slot for vehicle : "+vehicle.getVehicleNumber());
for(Slot slot : parkingSlots) {
if(slot.isEmpty() && String.valueOf(slot.getSlotType()).equals(String.valueOf(vehicle.getVehicleType()))) {
slot.parkVehicle(vehicle);
System.out.println(" Slot Found : "+slot.getSlotNUmber());
return slot;
}
}
return null; // No available slot found for the vehicle
}
public void removeSlot(int slotnumber){
for(Slot slot : parkingSlots) {
if(slot.getSlotNUmber() == slotnumber) {
System.out.println(" Removing Slot : "+slot.getSlotNUmber());
slot.removeVehicle();
}
}
}
}
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Slot> parkingslots = new ArrayList<>();
SlotFactory slotFactory = new SlotFactory();
for (int i = 1; i <= 30; i += 3) {
parkingslots.add(slotFactory.createSlot(SlotType.TWO_WHEELER, i));
parkingslots.add(slotFactory.createSlot(SlotType.FOUR_WHEELER, i + 1));
parkingslots.add(slotFactory.createSlot(SlotType.EIGHT_WHEELER, i + 2));
}
ParkingSpotManager manager = new ParkingSpotManager(parkingslots);
manager.parkVehicle(new TwoWheelerVehicle("111"));
manager.parkVehicle(new FourWheelerVehicle("411"));
manager.parkVehicle(new EightWheelerVehicle("812"));
}
}