Il mix di builder e factory è una buona idea?

3

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);
    }

}
  1. 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 e enginetype sono stati condivisi tra auto volanti e non volanti. così ho creato un append(numdoors, engineType) che è stato chiamato da append con più parametri.

  2. La prossima cosa è che wing che era unico per la macchina volante è stato escluso.

Questo è uno schema noto? Buono ? Male ? E perché?

    
posta JavaDeveloper 27.01.2017 - 22:43
fonte

1 risposta

2

Le fabbriche hanno davvero a che fare con astrazioni e polimorfismo, ad es. creare un'istanza per alcune interfacce o classi astratte senza specificare l'implementazione concreta. In questo caso hai solo una macchina di classe concreta.

Quindi entrambe le varianti sono costruttive, la prima ha molta più chiarezza. Il secondo, quello che chiamate fabbrica, non è un intento comunicativo (ho davvero bisogno di analizzarlo a fondo per capire cosa sta facendo). Non mi piace affatto, è un po 'complicato.

Perché genera un costruttore da una nuova auto istanziata? Ciò mi sembra strano, il costruttore dovrebbe istanziare Car, non il contrario.

Da questo. Se la tua auto ha un costruttore parametrico predefinito, allora perché hai ancora il costruttore? Potresti semplicemente rinnovare la macchina e impostare le proprietà contro di essa provenienti da carConfig? Il costruttore non sembra fornire alcuna garanzia, impostazioni predefinite o altrimenti completa logica su come costruire una macchina.

Potresti prendere in considerazione l'idea di introdurre una classe FlyingCar con una proprietà wing, quindi i pattern inizieranno ad avere più senso. Il costruttore potrebbe esporre le opzioni di configurazione delle ali, solo quando stai costruendo una FlyingCar ecc.

    
risposta data 28.01.2017 - 11:37
fonte

Leggi altre domande sui tag