我来自C ++背景,最近开始学习设计模式。
我遇到Head First Design Patterns的代码问题:
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构造函数复制):
public PizzaStore(SimplePizzaFactory factory) {
this.factory = factory;
}
由于
答案 0 :(得分:3)
PizzaStore类已包含SimplePizzaFactory对象
好吧,PizzaStore有一个SimplePizzaFactory类型的非初始化属性。在PizzaStore构造函数中,该属性是初始化,带有对构造函数参数的引用。这是Java代码中的常用模式。
传入的对象未使用任何数据初始化(需要由PizzaStore构造函数复制)
没有必要在构造函数中添加初始化代码,因为SimplePizzaFactory已经初始化了。该工厂未被复制,由PizzaStore属性引用,因此在执行构造函数之后,PizzaStore中的工厂是一个已经初始化的对象。
答案 1 :(得分:2)
这是Java与C ++不同的地方。当您键入
时SimplePizzaFactory factory;
它不像在C ++中那样隐式调用无参数构造函数并创建一个对象。在Java中,factory
只是null
。这是因为Java中的变量更类似于C ++中的指针。以上类似于
SimplePizzaFactory *factory;
你会发现这根本不会创造一个价值。它只是制作一个指向任何有用的指针。如果你想给它一个值,你就必须这样做
factory = new SimpleFactory(...);
或者,如果你有另一个指针,你可以将该指针的值传递给它,因此它将指向相同的值。
SimpleFactory *otherFactory = ...;
...
factory = otherFactory;
这就是它在Java中的工作方式。简而言之,Java变量只是对象的引用,就像C ++指针一样(但是使用垃圾收集)。要使用引用,首先需要为其赋值。
答案 2 :(得分:0)
在Java&#34;一切都是对象&#34;并且需要明确地实例化,这就是为什么你可以将<xctk:IntegerUpDown
Value="{Binding PlacementTarget.FontSize, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
/>
类中的SimplePizzaFactory
视为需要实例化的指针(需要PizzaStore
)与传递给构造函数的参数相同,想象一个c ++指针作为参数传递给构造函数,在调用new SimplePizzaFactory();
构造函数之前,指针应该已经在其他地方实例化了。
答案 3 :(得分:0)
查看PizzaStore
获取SimplePizzaFactory
的{{3}}课程。
SimplePizzaFactory factory = new SimplePizzaFactory();
PizzaStore store = new PizzaStore(factory);
这是创建实际SimplePizzaFactory
并将其传递给构造函数的位置。如果你不这样做,那么工厂将不会被初始化,即null
并且以下代码行将抛出NullPointerException
:
pizza = factory.createPizza(type);