Questo esempio di modello di metodo di produzione viola violare open-close?

5

In Modelli di progettazione head-first, usano un esempio di pizzeria per dimostrare il modello di metodo di fabbrica.

public abstract class PizzaStore {
  public Pizza orderPizza(String type) {
    Pizza pizza;

    pizza = createPizza(type);

    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();

    return pizza;
  }

  abstract Pizza createPizza(String type)
}

public class NYPizzaStore extends PizzaStore {
  Pizza createPizza(String item) {
    if (item.equals("cheese") {
        return new NYStyleCheesePizza();
    } else if (item.equals("veggie")) {
        return new NYStyleVeggiePizza();
    } else if (item.equals("clam")) {
        return new NYStyleClamPizza();
    } else if (item.equals("pepperoni")) {
        return new NYStylePepperioniPizza();
    } else return null;
  }
}

Non capisco come questo modello non stia violando open-close. Cosa succede se abbiamo bisogno di una pizza di manzo, quindi dobbiamo modificare l'istruzione if nella classe NYPizzaStore.

    
posta William 19.08.2014 - 20:29
fonte

2 risposte

12

Tecnicamente, si tratta di una violazione, ma non è il peggior tipo di violazione, perché è limitata a quel punto. Hai bisogno di qualche modo di aggiungere un nuovo tipo alla lista, e in questo modo è semplice e relativamente infallibile.

Tieni presente che la maggior parte dei linguaggi di programmazione non ha un modo semplice per chiamare automaticamente una funzione quando viene caricato un programma. Devi fare cose strane con modelli o riflessioni. Ciò significa che anche se hai una sorta di modo per registrare dinamicamente nuovi tipi di pizza con questo factory, c'è ancora un punto in cui main chiama infine la funzione register per il nuovo tipo di pizza, quindi devi aggiungerlo a qualche lista qualche parte . Il vantaggio di metterlo in fabbrica è che non stai inizializzando alcuna risorsa per questo tipo di pizza finché non ne hai effettivamente bisogno.

In pratica, è estremamente difficile scrivere codice OCP puro e di solito non ne vale la pena. Se stai modificando solo una funzione e quella funzione è chiaramente un elenco di inizializzazione o di fabbrica, stai andando piuttosto bene.

    
risposta data 19.08.2014 - 21:38
fonte
0

Questo esempio non è una violazione del principio di open-closed. Puoi continuare ad aggiungere nuovi tipi di pizza sottoclasse NYPizzaStore :

class UpmarketNYPizzaStore extends NYPizzaStore {
    Pizza createPizza(String type) {
        if (type.equals("beef")) {
            return new BeefPizza();
        }
        return super.createPizza(type);
    }
}
    
risposta data 20.08.2014 - 09:34
fonte

Leggi altre domande sui tag