これは、古典的な工場パターンの問題です。
解決策は、静的マップを維持する必要があるときはいつでも、新しい「バー」タイプがあるときはいつでも、最初にそれをマップに登録する必要があるため、そのタイプのオブジェクトが必要なときはいつでも、マップから選択するだけです。
以下のクラスを検討してください
interface IVehicle {
public void drive();
public void stop();
}
class Car implements IVehicle {
public void drive(){
//logic goes here
}
public void stop(){
//logic goes here
}
}
class VehicleFactory{
public IVehicle createVehicle(String VehicleType){
IVehicle vehicle = null;
if("Car".equalsIgnoreCase(VehicleType) ){
vehicle = new Car();
}
if("Bus".equalsIgnoreCase(VehicleType) ){
//vehicle = new Bus();
}
if("Train".equalsIgnoreCase(VehicleType) ){
//vehicle = new Train();
}
return vehicle;
}
}
したがって、新しいタイプの車両があるときはいつでも、新しいタイプの車両のコードを追加して方法を変更する必要があります。
解決策は、VehicleFactory クラスを以下のように改善することです。すべての車両タイプは、以下に示すようにマップに登録する必要があります。
class Car implements IVehicle {
static{
VehicleFactoryFlexible.registerVehicle("Car", new Car());
}
public void drive(){
//logic goes here
}
public void stop(){
//logic goes here
}
public IVehicle createVehicle(){
return (IVehicle) new Car();
}
}
public class VehicleFactoryFlexible {
static Map vehicleRegistry = new HashMap();
public static void registerVehicle(String vehicleType, IVehicle veh){
vehicleRegistry.put(vehicleType, veh);
}
public IVehicle createVehicle(String vehicleType){
IVehicle vehicle = (IVehicle)vehicleRegistry.get(vehicleType);
return vehicle.createVehicle();
}
}