我来自C ++背景,最近开始学习设计模式。
我遇到了Head First Design Patterns中的这段代码的问题:
链接:PizzaStore.java
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类的构造方法中传递工厂对象有什么意义?
PizzaStore类已经包含一个SimplePizzaFactory对象
传递的对象未使用任何数据初始化(需要由PizzaStore构造函数复制):
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
谢谢
最佳答案
这是Java与C ++不同的地方。当您键入
SimplePizzaFactory factory;
这与C ++中隐式调用无参数构造函数并创建对象的情况不同。在Java中,
factory
将简称为null
。这是因为Java中的变量与C ++中的指针更相似。上面类似于SimplePizzaFactory *factory;
您会意识到这根本不会创造任何价值。它只是使一个指针指向没有任何用处。如果您想给它一个价值,就必须做
factory = new SimpleFactory(...);
或者,如果您有另一个指针,则可以将该指针的值传递给它,这样它将指向相同的值。
SimpleFactory *otherFactory = ...;
...
factory = otherFactory;
这就是它在Java中的工作方式。简而言之,Java变量只是对对象的引用,就像C ++指针一样(但带有垃圾回收)。要使用参考,首先需要为其分配一个值。