Simple factory with class registration using Product.newInstance
In the previous code, we used reflection to instantiate new vehicles. If we have to avoid reflection, we can use a similar factory where to register the new vehicle classes the factory should be able to create. Instead of adding classes to the map, we are going to add instances of each type of object we want to register. Each product will be able to create a new instance of itself.
We start by adding an abstract method in the base Vehicle class:
abstract public Vehicle newInstance();
For each product, the method declared abstract in the base class must be implemented:
@Override public Car newInstance() { return new Car(); }
In the factory class, we are going to change the map to keep the IDs of the objects along with the vehicle objects:
private Map<String, Vehicle> registeredProducts = new HashMap<String,Vehicle>();
Then we register a new type of vehicle by passing an instance of it:
public void registerVehicle(String vehicleId, Vehicle vehicle) { registeredProducts.put(vehicleId, vehicle); }
We change the createVehicle method accordingly:
public AbstractProduct createVehicle(String vehicleId) { return registeredProducts.get(vehicleId).newInstance(); }