在依赖SimplePizzaFactory时,PizzaStore如何接受不同的工厂?

时间:2018-05-02 14:52:22

标签: java design-patterns factory

当我阅读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,我们如何使用NYPizzaFactory实例创建PizzaStore实例 ChicagoPizzaFactory实例?

感谢您的所有答案!回答一些答案,如果新的答案以同样的方式出现:

  • 有些人提到了AbstractFactory或PizzaFactory接口。我知道 这个概念,但这个概念在本书后面提到,作为抽象 工厂模式,工厂方法模式后。所以我没有想到 简单工厂在这里意味着AbstractFactory相关概念。

  • NYPizzaFactory和ChicagoPizzaFactory延伸 SimplePizzaFactory就是这样,但如果作者的意思是,我无法理解为什么他们会关注质量控制,如下所示:

  

所以你测试了SimpleFactory的想法,你找到了什么   特许经营权正在用你的工厂制作比萨饼,但是   开始采用他们自己的本土程序为其余的   过程:他们以不同的方式烘烤东西,他们忘了切割   披萨,他们使用第三方盒子。重新思考问题a   你看,你真正喜欢的是创建一个框架   将商店和披萨创作联系在一起,但仍然允许   要保持灵活的事情。

3 个答案:

答案 0 :(得分:1)

您仍然会PizzaStoreFactory,但它应该是abstract班级或interfaceNYPizzaFactory& ChicagoPizzaFactory源自它。

这允许您的PizzaStore对象以多态方式创建比萨饼,而无需知道它使用哪种类型的工厂来制作它们。

答案 1 :(得分:0)

如果NYPizzaFactoryChicagoPizzaFactory 延伸 SimplePizzaFactory,则可以这样做。

另一种可能性是创建一个PizzaFactory接口,并使PizzaStore依赖于此。然后PizzaFactoryNYPizzaFactorySimplePizzaFactory等)的所有具体实现都可以传递给PizzaStore

答案 2 :(得分:0)

根据你的要求,有一个AbstractFactory的概念。

其中,除了根据传递给createPizza()函数的类型创建披萨的方法之外,还需要先使用其他函数在创建披萨之前设置所需的PizzaFactory。