gpt4 book ai didi

java - 在 AbstractFactory 中声明静态方法的缺点

转载 作者:行者123 更新时间:2023-12-01 21:40:21 24 4
gpt4 key购买 nike

根据 Head First 设计模式,在 Factory 类中声明静态方法的缺点 - “您无法子类化并更改 getPizza 方法的行为”。 Factory 类使用 getPizza 方法来决定返回哪种类型的对象。如果我理解正确的话,我的类(class)是

    public class PizzaFactory {
public static Pizza getPizza(String type) {
if (type.equals("cheese"))
return new CheesePizza();
else if (type.equalsIgnoreCase("thisCrust"))
return new ThinCrustPizza();
return null;
}
}

即使该方法是静态的,我始终可以创建一个子类,例如 -

public class DelhiPizzaFactory extends PizzaFactory {
public static Pizza getPizza(String type) {
if (type.equals("cheese"))
return new CheesePizza();
else if (type.equalsIgnoreCase("thisCrust"))
return new ThinCrustPizza();
return null;
}
}

我可以互换使用父类(super class)和子类。

public class PizzaStore {

Pizza pizza;

public void orderPizza(String type) {
pizza = DelhiPizzaFactory.getPizza(type);
pizza.prepare();
pizza.bake();
}
}

那么缺点是什么?

最佳答案

这是一个用例问题。考虑一下这种情况,您正在使用的 API 具有某些全局 API 的以下方法。

public void setPizzaFactory(PizzaFactory factory) {
this.pizzaFactory=factory;
// set pizza factory and
}

通常,您可以将两个工厂作为参数传递给该方法,但如果我们的 API 将使用您刚刚设置的 PizzaFactory,并调用其 getPizza() 方法,它将始终使用尽管您可能已经传递了一些其他派生类作为工厂对象,但在 PizzaClass 中声明了 getPizza() 方法。

如果你的工厂中有非静态方法,那么你可以这样做

api.setPizzaFactory(new DoubleCheesePizzaFactory) 其中 DoubleCheesePizzaFactory 覆盖 getPizza 方法,以便始终为每个披萨添加额外的奶酪。这样,内部“烘焙”API 将使用 DoubleCheesePizzaFactory 中的 getCheese 方法版本,而不是 PizzaFactory.getPizza 版本(又名。super.获取披萨)

所以缺点就是这样:您无法更改(通过覆盖)super 类中的方法的行为。

关于java - 在 AbstractFactory 中声明静态方法的缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36547262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com