Как PizzaStore может принимать разные фабрики в зависимости от SimplePizzaFactory? - PullRequest
0 голосов
/ 02 мая 2018

Когда я читаю фабричный паттерн Head First Design Patterns, я путаюсь, читая простую фабричную часть. Вот диаграмма классов. enter image description here

Код PizzaStore:

 public class PizzaStore {

  SimplePizzaFactory factory;

  public PizzaStore(SimplePizzaFactory factory) {
    this.factory = factory;
  }

  public Pizza orderPizza(String type) {
    Pizza pizza;
    pizza = factory.createPizza(type);
    pizza.prepare();
    pizza.bake();
    pizza.cut();
    pizza.box();
    return pizza;
  }
// other methods here
}

код для SimplePizzaFactory

public class SimplePizzaFactory {

  public Pizza createPizza(String type) {
    Pizza pizza = null;
    if (type.equals("cheese")) {
      pizza = new CheesePizza();
    } else if (type.equals("pepperoni")) {
      pizza = new PepperoniPizza();
    } else if (type.equals("clam")) {
      pizza = new ClamPizza();
    } else if (type.equals("veggie")) {
      pizza = new VeggiePizza();
    }
    return pizza; 
  }
}

в франчайзинге части магазина пиццы, это говорит:

Если мы возьмем SimplePizzaFactory и создадим три разных фабрики, NYPizzaFactory, ChicagoPizzaFactory и CaliforniaPizzaFactory, тогда мы можем просто составить PizzaStore с подходящая фабрика и франшиза - это хорошо.

в коде,

NYPizzaFactory nyFactory = new NYPizzaFactory();
PizzaStore nyStore = new PizzaStore(nyFactory);
nyStore.order(“Veggie”);

ChicagoPizzaFactory chicagoFactory = new ChicagoPizzaFactory();
PizzaStore chicagoStore = new PizzaStore(chicagoFactory);
chicagoStore.order(“Veggie”);

Мои вопросы: PizzaStore зависит от конкретного класса, который SimplePizzaFactory, как мы можем создать экземпляр PizzaStore с экземпляром NYPizzaFactory или Экземпляр ChicagoPizzaFactory?

Спасибо за все ваши ответы! В ответ на некоторые ответы, в случае, если новые ответы приходят таким же образом:

  • Некоторые упоминают AbstractFactory или интерфейс PizzaFactory. я знал эта концепция, но эта концепция приходит позже в книге, как абстрактный фабричный образец, после фабричного образца метода. Так что я не думаю простая фабрика означает понятие, связанное с AbstractFactory.

  • NYPizzaFactory и ChicagoPizzaFactory расширяются SimplePizzaFactory, да, конечно, но если авторы имеют в виду это, я не могу понять, почему они касаются контроля качества, как показано ниже:

Итак, вы протестировали идею SimpleFactory, и вы обнаружили, что что франшизы использовали вашу фабрику для создания пиццы, но начать использовать свои собственные процедуры для дома для остальных процесс: они пекут вещи немного по-другому, они забывают резать пицца, и они использовали сторонние коробки. Переосмысление проблемы немного, вы видите, что вы действительно хотели бы сделать, это создать структуру что связывает магазин и создание пиццы вместе, но все же позволяет вещи остаются гибкими.

Ответы [ 3 ]

0 голосов
/ 02 мая 2018

Существует понятие AbstractFactory, согласно тому, что вы спрашиваете.

При этом в дополнение к методу, в котором вы создаете пиццу на основе типа, переданного в функцию createPizza (), вам также необходимо сначала установить требуемый PizzaFactory перед созданием пиццы, используя другую функцию.

0 голосов
/ 02 мая 2018

У вас все еще будет PizzaStoreFactory, но это должен быть либо abstract класс, либо interface, с NYPizzaFactory & ChicagoPizzaFactory, полученными из него.

Это позволяет вашему PizzaStore объекту полиморфно создавать пиццу, не зная, какой тип фабрики он использует для ее изготовления.

0 голосов
/ 02 мая 2018

Это можно сделать, если NYPizzaFactory и ChicagoPizzaFactory расширяются SimplePizzaFactory.

Другая возможность заключается в создании интерфейса PizzaFactory и зависимости PizzaStore от этого. И тогда все конкретные реализации PizzaFactory (NYPizzaFactory, SimplePizzaFactory и т. Д.) Могут быть переданы в PizzaStore.

...