我来自C++背景,最近开始学习设计模式。
我面临着来自Head First Design模式的这段代码的问题:
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;
}
}请帮助我解决以下疑问:
在PizzaStore类的构造函数中传递一个工厂对象有什么相关性?
谢谢
发布于 2017-11-28 15:20:57
这是Java不同于C++的地方之一。当你打字时
SimplePizzaFactory factory;它不像在C++中那样,它隐式调用一个无参数构造函数并创建一个对象。在Java中,factory只是null。这是因为Java中的变量更类似于C++中的指针。以上内容类似于
SimplePizzaFactory *factory;你会意识到这根本没有创造价值。它只是做了一个指针,没有指向任何有用的东西。如果你想给它一个价值,你必须这样做
factory = new SimpleFactory(...);或者,如果您有另一个指针,则可以将该指针的值传递给它,因此它将指向相同的值。
SimpleFactory *otherFactory = ...;
...
factory = otherFactory;它在Java中就是这样工作的。简而言之,Java变量只是对对象的引用,就像C++指针(但使用了垃圾收集)。要使用引用,首先需要为其赋值。
发布于 2017-11-28 15:19:59
PizzaStore类已经包含一个SimplePizzaFactory对象。
嗯,PizzaStore有一个SimplePizzaFactory类型的SimplePizzaFactory属性。在PizzaStore构造函数中,该属性是引用构造函数参数的初始化。这是Java代码中常见的模式。
传递的对象不使用任何数据(需要由PizzaStore构造函数复制)初始化。
不需要在构造函数中添加初始化代码,而是说明SimplePizzaFactory已经初始化。该工厂不是复制的,而是由PizzaStore属性引用的,因此在执行构造函数之后,PizzaStore中的工厂是一个已经初始化的对象。
发布于 2017-11-28 15:22:23
在Java中,“一切都是一个对象”并需要显式实例化,这就是为什么您可以将PizzaStore类中的PizzaStore看作一个指针,它需要与传递给构造函数的参数相同(需要有new SimplePizzaFactory();),假设一个c++指针作为参数传递给构造函数,在调用PizzaStore‘构造函数之前,应该已经在其他地方实例化了指针。
https://stackoverflow.com/questions/47534853
复制相似问题