当我阅读Head First Design Patterns的工厂模式时,我在阅读简单的工厂部分时感到困惑。这是类图。
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 你看,你真正喜欢的是创建一个框架 将商店和披萨创作联系在一起,但仍然允许 要保持灵活的事情。
答案 0 :(得分:1)
您仍然会PizzaStoreFactory
,但它应该是abstract
班级或interface
,NYPizzaFactory
& ChicagoPizzaFactory
源自它。
这允许您的PizzaStore
对象以多态方式创建比萨饼,而无需知道它使用哪种类型的工厂来制作它们。
答案 1 :(得分:0)
如果NYPizzaFactory
和ChicagoPizzaFactory
延伸 SimplePizzaFactory
,则可以这样做。
另一种可能性是创建一个PizzaFactory
接口,并使PizzaStore
依赖于此。然后PizzaFactory
(NYPizzaFactory
,SimplePizzaFactory
等)的所有具体实现都可以传递给PizzaStore
。
答案 2 :(得分:0)
根据你的要求,有一个AbstractFactory的概念。
其中,除了根据传递给createPizza()函数的类型创建披萨的方法之外,还需要先使用其他函数在创建披萨之前设置所需的PizzaFactory。