Ho un oggetto Car
costruito usando il modello di builder.
Il problema era rappresentato dalla ridondanza del codice.
Car.Builder builder = new Car.Builder("Mercedes");
builder.numDoors(carConfig.getNumDoors()
builder.engineType(carConfig.getEngineType())
builder.isManual(isManual)
builder.build())
Car.Builder builder = new Car.Builder("BMW");
builder.numDoors(carConfig.getNumDoors()
builder.engineType(carConfig.getEngineType())
builder.isManual(isManual)
builder.build())
Car.Builder builder = new Car.Builder("FlyingCar");
builder.numDoors(carConfig.getNumDoors()
builder.engineType(carConfig.getEngineType())
builder.wing(TypeName)
builder.build())
Quindi ho pensato a un'idea per ridurre l'ingombro del codice usando il modello di fabbrica. Usando la fabbrica qui sotto, posso creare facilmente Car.
Car mercedes = CarFactory.createNonFlyingCar("Mercedes");
Car bmw = CarFactory.createNonFlyingCar("BMW");
Car flyCar = CarFactory.createFlyingCar("FlyingCarBrand");
public class CarFactory {
// brand can be BMW or Mercedes or Audi etc.
public static Car createNonFlyingCar(String brand, CarConfiguration carConfig, Engine engine) {
Car.Builder builder = new Car.Builder(brand);
append(builder, carConfig.getNumDoors(), carConfig.getEngineType(), engine.isManual()).build();
}
public static Car createFlyingCar(CarConfiguration carConfig, Wings wings) {
Car.Builder builder = new Car.Builder("NewFlyingCar");
append(builder, carConfig.getNumDoors(), carConfig.getEngineType()).wings(wing.getType()).build(); // added extra 'wings' method here.
}
// overload append.
private static void append(
Car.Builder builder,
int numDoors,
Sting engineType,
boolean isManual;
)
{
return append(builder, numDoors, engineType).isManual(isManual);
}
private static void append(
Car.Builder builder,
int numdoors,
String engineTye
)
{
return builder.numdoors(numdoors).engineType(engineTyoe);
}
}
-
Una cosa che ho fatto in fabbrica era il sovraccarico del metodo append. Quando sono stati coinvolti campi comuni, li hanno usati. Ad esempio:
numdoors
eenginetype
sono stati condivisi tra auto volanti e non volanti. così ho creato unappend(numdoors, engineType)
che è stato chiamato da append con più parametri. -
La prossima cosa è che
wing
che era unico per la macchina volante è stato escluso.
Questo è uno schema noto? Buono ? Male ? E perché?