在简单工厂设计模式(Head-First)中传递工厂对象的目的?

时间:2017-11-28 15:11:58

标签: java design-patterns

我来自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;
    

    }

由于

4 个答案:

答案 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);