Let's say I have a class hierarchy like this:
Now let's suppose I add later a new interface Mechanic
, responsible for repairing a vehicle. Of course someone capable of repairing a car won't fix your broken bus. So you would have the BusMechanic and CarMechanic as implementations. My question would be, how do you create the right kind of mech ?
I see either :
The Vehicle interface could instantiate the right mech
I could add a method to the vehicle interface Mechanic createMechanic()
which would create a new Mechanic instance with the right class and parameters
I find that it breaks SRP since that means that a vh has to handle its mech which is kinda nonsense.
Also it clutters the interface.
The Vehicle interface could provide the factory
Another possibility would be to add a method MechanicFactory getMechFactory()
. This would fix the SRP issue, but I still don't really like it.
The Vehicle interface would still get cluttered
The chain of calls could get really long and not really readable, like
customer.getVehicleFleet().getVehicleRegistry().getVehiculeForPlate(xxx).getMechanicFactory().createMechanic().getToolManager().getToolFactory().getRequiredTools()
The vehicle providing the factory for the mechs is still a non-sense
Using a map/enum
I could also map the classes implementing Vehicle with the right mechanic implementation like :
Map.of(Car.class, CarMechanic.class,
Bus.class, BusMechanic.class)
That would mean that someone subclassing a vehicle would also have to find all the relevant locations to map its class to the correct implementations
So far, the 2nd approach seems the better one, albeit far from ideal